Próbuję usunąć kilka plików z określonego katalogu (w systemie Mac OS X za pomocą terminala)
ls | grep \([1-9]\) | xargs rm
powinien załatwić sprawę, ale tak nie jest. Próbuję usunąć dowolny plik z pojedynczą cyfrą w nawiasach w nazwie pliku (duplikaty pobrane z Internetu), ale w końcu robi coś takiego:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
ponieważ nie interpretuje poprawnej przestrzeni. Powinien usunąć „520syllabus2010 (3) .pdf”
Jak to zrobić w odpowiedni sposób?
Dzięki, Jeff
#
.#
.(3)
. Najlepiej cytować argumenty, aby powłoka ich nie dotyczyła.Odpowiedzi:
Krótka wersja:
Nie podłączaj
ls
do rurxargs
. Zamiast ruryfind ... -print0
doxargs -0
, w celu uniknięcia takich problemów.... które można zapisać jako:
i:
który można dodatkowo skrócić
rm
za pomocą symbolu wieloznacznego.Normalnie,
ls
ifind
oddzielne nazwy plików ze znakami nowej linii, alexargs
dzieli swoje wejście od nowego wiersza lub przestrzeni, w wyniku zachowań widać.Możliwe jest
xargs
podzielenie tylko według nowego wiersza, ale pliki mogą mieć także nowe wiersze w swoich nazwach. W rzeczywistości w Linuksie i BSD jedynym niedozwolonym znakiem jest bajt „zerowy” lub zerowy - więc należy go używać w takich przypadkach.W powyższym przykładzie 2
-print0
mówifind
o oddzieleniu nazw plików bajtem zerowym; to samo dlaxargs -0
. (Kilka innych narzędzi ma również podobne opcje, takie jaksort -z
lubgrep -zZ
.)„Wersja skrócona” wykorzystuje prosty znak wieloznaczny powłoki („wzorzec” w
bash
instrukcji - patrz sekcja „Rozszerzenie nazwy ścieżki”).źródło
*" "\\([1-9]\\).*
aby usuwane były tylko pliki ze spacją przed liczbą paren'd przed (a, żeby być sprawiedliwym) okresem.