Kiedy używam xargs
czasami nie trzeba jawnie użyć ciągu wymień:Modyfikacja zastąpić ciąg w xargs
find . -name "*.txt" | xargs rm -rf
w innych przypadkach, chcę, aby określić ciąg zastępujący w tym celu rzeczy jak:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
poprzedniego polecenia byłoby przenieść wszystkie pliki tekstowe w ramach bieżącego katalogu do /foo
i będzie dołączyć rozszerzenie bar
do wszystkich plików.
Jeśli zamiast dołączać jakiś tekst do ciągu zastępującego, chciałem zmodyfikować ten ciąg tak, żebym mógł wstawić jakiś tekst między nazwą i rozszerzeniem plików, jak mogłem to zrobić? Na przykład, powiedzmy, że chcę zrobić to samo, co w poprzednim przykładzie, ale nazwy plików powinny zostać zmienione/przeniesione z <name>.txt
na /foo/<name>.bar.txt
(zamiast /foo/<name>.txt.bar
).
UPDATE: udało mi się znaleźć rozwiązanie:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
Ale zastanawiam się, czy jest krótszy/lepszym rozwiązaniem.
No, chyba, że będę używać więcej powołując 'mv "$ 1" "foo/$ {nazwa} .bar $ {eXT}"' i można zrobić '. basename 'like this:' base = $ {1 ## * /} '. Powinieneś opublikować swoje rozwiązanie jako odpowiedź i zaakceptować je. –
@DennisWilliamson Dzięki za komentarz! Poczekam jeszcze trochę, żeby sprawdzić, czy ktoś nie wymyśli sobie jakiejś wymyślnej rzeczy, inaczej sam odpowiem na to pytanie. – betabandido
Myślę, że jeśli nazwa pliku jest ostatnią rzeczą w linii, nie potrzebujesz -I {} ani {} w linii poleceń. (Zauważ, że głównym celem xargs jest grupowanie, więc jeśli NIE chcesz wielu rzeczy na końcu 1 wywołania argumentu xargs potrzebujesz "-l 1" (lub -L 1 dla niektórych wersji xargs). -I {} oznacza -l 1, więc to też działa tutaj.) –