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.
command-line
find
rm
xargs
Ashley
źródło
źródło
find -name "*\ *.txt" | xargs rm
działa na dwa pliki słów?Odpowiedzi:
Możesz powiedzieć
find
ixargs
używać zarówno terminatorów zerowychlub (prościej) użyj wbudowanej
-delete
akcjifind
lub (dzięki @kos)
który z nich powinien przestrzegać
ARG_MAX
limitu systemu bez potrzebyxargs
.źródło
ARG_MAX
, że wspomnę również, żefind . -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
źródło
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
Odpowiedź źródła na SO .
źródło
-0
zamiast-d
(forxargs
) dla systemów BSD. Czego używa Ubuntu? Zastosowano tutaj zaakceptowaną odpowiedź-0
. Co jest poprawne?