piątek, 3 grudnia 2010

zautomatyzowane kopiowanie z wykorzystaniem xargs oraz cp w Linux'ie

Gdy chcemy skopiować pliki z jednego miejsca w drugie i mają one spełniać określone warunki można napisać pętle for, pytanie tylko czy jest sens bawić się z tym aż tak gdy można użyć poleceń ls, awk, xargs (mi się to przynajmniej łatwiejsze wydaje).

Mam tendencję do nie czyszczenia karty pamięci w aparacie więc gdy chce skopiować jakieś świeżo zrobione zdjęcia z aparatu w inną lokalizację wyświetla się naprawdę długa lista.
Zamiast zrobić ls -laht, grepować po dacie, i klikać albo wpisywać dla każdego pliku cp wolę wykonać następujące polecenie:
ls -lah | grep 2010-12-04 | awk '{print $8}' | xargs -i cp {} /home/pawel/Pulpit/mieszkanie/aranzacja/


Teraz po polsku:
ls -lah - wyświetlenie wszystkich plików z bieżącego katalogu wraz z atrybutami,
grep 2010-12-04 - wyświetlenie plików które zostały stworzone w dniu dzisiejszym,
awk '{print $8}' - wyświetla zawartość ósmej kolumny, czyli nazwę pliku,
| - przekazanie wyników jednego polecenia do następnego polecenia tzw. pipe (nie wiem jak to się nazywa po polsku - jeżeli ktoś wie to proszę o komentarz z informacją),
xargs -i cp {} /home/pawel/Pulpit/mieszkanie/aranzacja/ - przekazanie wyników do programu xargs, który dla każdej danej wejściowej wykonuje określoną czynność, w man'ie dla xargs przy opcji -i jest napisane "-i[replace-str] This option is a synonym for -Ireplace-str if replace-str is
specified, and for -I{} otherwise. This option is deprecated; use -I instead." więc wnioskuję, że przy jej włączeniu wykonuje cp i podaje wartości plików które ma kopiować jako to co zostało uzyskane z poprzedniego polecenia. Inaczej można to określić jako wstawienie wyniku polecenia poprzedniego do nawiasu {} i wykonanie dla każdego pliku polecenia zdefiniowanego zaraz po słowie xargs.
Chyba się trochę zapętliłem - ale w końcu kto normalny pisze o 2 w nocy posta na blogu w piątek :).
Na samym końcu polecenia dodajemy ścieżkę, do której pliki należy skopiować.

Wykorzystanie xargs do usuwania plików jest znacznie łatwiejsze, ponieważ nie trzeba korzystać z -i, np.:

ls -lah | grep 2010-12-04 | awk '{print $8}' | xargs -rf

r - usuwanie rekurencyjne (jeżeli chcemy usunąć same pliki to proponuję korzystać z samej opcji -f bo jak się nam coś omsknie to można "trochę" za dużo usunąć),
f - nie pytaj czy chce usunąć plik/katalog, po prostu go usuń (od ang. force).

Brak komentarzy:

Prześlij komentarz