W twoim przykładzie nie musisz wcale używać, xargs
ponieważ find
zrobi dokładnie i bezpiecznie to, co chcesz zrobić.
Dokładnie to, czego chcesz użyć find
to:
find -maxdepth 1 -name '*Cases*' -exec touch {} +
W tym przykładzie -maxdepth 1
oznacza tylko wyszukiwanie w bieżącym katalogu, nie schodź do żadnych podkatalogów; domyślnie find będzie szukał we wszystkich podkatalogach (co często jest tym, czego chcesz), chyba że ograniczysz go z maxdepth. Jest {}
to nazwa pliku, który zostanie zastąpiony na swoim miejscu i +
jest jednym z dwóch znaczników końca polecenia, drugim jest ;
. Różnica między nimi polega na tym, ;
że polecenie wykonuje się na każdym pliku pojedynczo, natomiast +
polecenie wykonuje się na wszystkich plikach jednocześnie. Należy jednak pamiętać, że powłoka będzie prawdopodobnie próbować interpretować ;
siebie, więc trzeba będzie uciec z albo \;
albo ';'
. Tak, find
ma wiele takich niedogodności, ale jego moc nadrabia to.
Zarówno find
i xargs
są trudne, aby dowiedzieć się w pierwszej kolejności. Aby pomóc w nauce, xargs
spróbuj użyć opcji -p
lub --interactive
, która pokaże polecenie, które zamierza wykonać, i podpowie, czy chcesz je uruchomić.
Podobnie find
możesz użyć -ok
zamiast, -exec
aby zapytać, czy chcesz uruchomić polecenie.
Są jednak chwile, kiedy find
nie będzie w stanie zrobić wszystkiego, co chcesz, i to jest miejsce xargs
. -exec
Polecenie zaakceptuje tylko jedno wystąpienie {}
, więc jeśli wystąpi błąd find -type f -exec cp {} {}.bak \;
, możesz zamiast tego zrobić tak :find -type f -print0 | xargs -0 -l1 -IX cp X X.bak
Możesz dowiedzieć się więcej o poleceniach uruchamiania w podręczniku GNU Findutils .
Wspomniałem również, że find
bezpiecznie robi to, co chcesz, ponieważ podczas pracy z plikami napotkasz spacje i inne znaki, które będą powodować problemy, xargs
chyba że użyjesz opcji -0
lub --null
wraz z czymś, co generuje elementy wejściowe zakończone znakiem null białych znaków.
xargs
i$(...)
), xargs jest znacznie bezpieczniejszy niż zastępowanie poleceń. I nie mogę sobie przypomnieć, że kiedykolwiek natrafiłem na prawidłową nazwę pliku z nową linią. Czy problemy z ucieczką i rozszerzaniem słów nie są związane z zastępowaniem poleceń, a nie xargsem?