Jak wykonać polecenie na liście nazw plików w pliku?

11

Wymieniłem nazwy plików, które mają zostać usunięte do pliku. Jak mogę przekazać plik do rmpolecenia, aby mógł je usuwać jeden po drugim.

monu
źródło
1
Zobacz FAQ 001 na Wiki Grega ...
jasonwryan

Odpowiedzi:

11

Jeśli masz jeden plik w linii, jednym ze sposobów jest:

tr '\n' '\0' < list_of_files_to_be_deleted.txt | xargs -0 -r rm --

Lista plików jest podawana jako dane wejściowe dla trpolecenia, które zmienia separator plików z podawania liniowego na bajt zerowy, a xargspolecenie odczytuje pliki oddzielone bajtami zerowymi na wejściu i uruchamia polecenie rm z plikami dołączonymi jako argumenty.

Jonas Berlin
źródło
1
Sugeruję również użycie rm --zamiast po prostu rm, aby nazwy plików, które mogą zaczynać się od myślnika, nie były traktowane jako rmparametry.
artyom
To nie zadziałało, kolego ... tr: extra operand monu.txt' Try tr --help 'po więcej informacji. rm: brakujący operand Aby uzyskać więcej informacji, wypróbuj `rm --help '. ........ To wszystko, co mogę zobaczyć
pon.
1
Czy może przegapiłeś <przed nazwą pliku?
Jonas Berlin
Ulepszyłem też trochę komendę xargs - dodałem - zgodnie z sugestią @artyoma i dodałem -r, aby upewnić się, że nie uruchomi się polecenia rm, jeśli nie ma żadnych plików do usunięcia.
Jonas Berlin
5

Powyższa odpowiedź jest dobra, ponieważ bardzo się stara, aby obsługiwać nazwy plików ze spacjami i „dziwnymi znakami”. Ale najprostszym sposobem, jeśli nazwy plików są rozsądne, jest po prostu (ostrzeżenie, bashism!):

rm $(< /the/file/with/names)

Dla zwykłej powłoki:

rm `cat /the/file/with/names`
vonbrand
źródło