Zwykle aby usunąć pliki ze spacjami w nazwie pliku, należy uruchomić:
$ rm "file name"
ale jeśli chcę usunąć wiele plików, np .:
$ find . -name "*.txt" | xargs rm
Nie spowoduje to usunięcia plików ze spacjami.
Zwykle aby usunąć pliki ze spacjami w nazwie pliku, należy uruchomić:
$ rm "file name"
ale jeśli chcę usunąć wiele plików, np .:
$ find . -name "*.txt" | xargs rm
Nie spowoduje to usunięcia plików ze spacjami.
Odpowiedzi:
Możesz powiedzieć find
i xargs
używać zarówno terminatorów zerowych
find . -name "*.txt" -print0 | xargs -0 rm
lub (prościej) użyj wbudowanej -delete
akcjifind
find . -name "*.txt" -delete
lub (dzięki @kos)
find . -name "*.txt" -exec rm {} +
który z nich powinien przestrzegać ARG_MAX
limitu systemu bez potrzeby xargs
.
ARG_MAX
, że wspomnę również, że find . -name "*.txt" -exec rm {} \;
byłby to „bezpieczny strzał”
-print0
musi być ostatnią opcją (lub przynajmniej później -name "*.txt"
), w przeciwnym razie spowoduje to uderzenie plików nie ograniczonych już do*.txt
...
Nawiasem mówiąc, jeśli użyłeś czegoś innego niż find, możesz użyć tr, aby zastąpić znaki nowej linii bajtami zerowymi.
Na przykład. poniższy jeden linijka usuwa 10 ostatnio zmodyfikowanych plików w katalogu, nawet jeśli mają w nazwach spacje.
ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm
Polecenie xargs domyślnie używa tabulatorów, spacji i nowych linii jako ograniczników. Możesz powiedzieć, aby używał tylko znaków nowej linii ('\ n') z opcją -d:
find . -name "*.txt" | xargs -d '\n' rm
-0
zamiast -d
(for xargs
) dla systemów BSD. Czego używa Ubuntu? Zastosowano tutaj zaakceptowaną odpowiedź -0
. Co jest poprawne?
find -name "*\ *.txt" | xargs rm
działa na dwa pliki słów?