Mam długi plik tekstowy z listą masek plików, które chcę usunąć
Przykład:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
Muszę je usunąć. Wypróbowano rm `cat 1.txt` i stwierdzono, że lista jest za długa.
Znalazłem to polecenie, ale kiedy sprawdzam foldery z listy, niektóre z nich nadal mają pliki.
xargs rm <1.txt
Ręczne wywołanie rm usuwa pliki z takich folderów, więc nie ma problemu z uprawnieniami.
Odpowiedzi:
Nie jest to zbyt wydajne, ale zadziała, jeśli potrzebujesz wzorców glob (jak w / var / www / *)
Jeśli nie masz żadnych wzorców i masz pewność, że ścieżki w pliku nie zawierają białych znaków ani innych dziwnych rzeczy, możesz użyć xargs w następujący sposób:
źródło
Zakładając, że lista plików znajduje się w pliku
1.txt
, wykonaj:Ta
-r
opcja powoduje rekursję do wszystkich katalogów wymienionych w1.txt
.Jeśli jakieś pliki są tylko do odczytu, użyj
-f
opcji wymuszenia usunięcia:Zachowaj ostrożność podczas wprowadzania danych do dowolnego narzędzia, które wykonuje programowe usuwanie. Zrobić pewien , że pliki wymienione w pliku wejściowym są naprawdę ma być usunięty. Uważaj szczególnie na pozornie proste literówki. Na przykład, jeśli wprowadzisz spację między plikiem a jego sufiksem, pojawią się dwie oddzielne nazwy plików:
to właściwie dwa oddzielne pliki:
file
i.txt
.To może nie wydawać się takie niebezpieczne, ale jeśli literówka wygląda mniej więcej tak:
Wtedy zamiast usuwając wszystkie pliki, które zaczynają się
myoldfiles
, będziesz skończyć usunięciemmyoldfiles
i wszystkie nie-dot-plików i katalogów w bieżącym katalogu. Prawdopodobnie nie to, czego chciałeś.źródło
Użyj tego:
Jeśli potrzebujesz ekspansji glob, możesz pominąć cytowanie
$file
:Ostrzegamy jednak, że nazwy plików mogą zawierać „problematyczne” treści i użyłbym wersji bez cytowania. Wyobraź sobie ten wzór w pliku
Spowoduje to usunięcie całkiem sporo z bieżącego katalogu! Zachęcam cię do przygotowania listy usuwania w taki sposób, że wzorce glob nie są już wymagane, a następnie użyj cytowania, jak w moim pierwszym przykładzie.
źródło
/My Dir With Spaces/
/Spaces and globs/*.txt
,--file-with-leading-dashes
i jako bonus To POSIX i działa na systemie GNU / Linux, MacOS i BSD.Możesz użyć „\ n” do zdefiniowania znaku nowego wiersza jako separatora.
Uważaj na -rf, ponieważ może usunąć to, czego nie chcesz, jeśli 1.txt zawiera ścieżki ze spacjami. Dlatego nowy ogranicznik linii jest nieco bezpieczniejszy.
W systemach BSD można użyć opcji -0, aby użyć znaków nowej linii jako separatora, jak poniżej:
źródło
xargs: illegal option -- d
-0
na OS X.xargs -I_ rm _
działa również w OS X :) patrz stackoverflow.com/a/39335402/266309-d
), możesz najpierw przekonwertowaćtr '\n' '\0' < 1.txt | xargs -0 rm
Możesz użyć tej jednej linijki:
Który powoduje rozszerzenie powłoki, ale wykonuje
rm
minimalną liczbę razy.źródło
-n <n>
argument, abyxargs
zmniejszyć liczbę argumentów przekazywanych do każdego rm, ale to nadal nie ochroni cię przed pojedynczym globem, który przekracza limit.xargs -I{} sh -c 'rm {}' < 1.txt
powinieneś robić, co chcesz. Uważaj na to polecenie, ponieważ jeden nieprawidłowy wpis w tym pliku może spowodować wiele problemów.Ta odpowiedź została zredagowana po tym, jak @tdavies wskazał, że oryginał nie rozwijał powłoki.
źródło
xargs -I{} sh -c 'rm {}' < 1.txt
W tym konkretnym przypadku, ze względu na niebezpieczeństwa przytoczone w innych odpowiedziach, zrobiłbym to
Edycja w np. Vimie i
:%s/\s/\\\0/g
, przed wszystkimi znakami spacji z ukośnikiem odwrotnym.Następnie
:%s/^/rm -rf /
poprzedzając polecenie. Dzięki temu-r
nie musisz się martwić, że katalogi są wymienione po plikach w nich zawartych, a dzięki-f
temu nie będziesz narzekać z powodu brakujących plików lub zduplikowanych wpisów.Uruchom wszystkie polecenia:
$ source 1.txt
źródło
cat 1.txt | xargs rm -f | bash
Uruchomienie polecenia wykona następujące czynności tylko dla plików.cat 1.txt | xargs rm -rf | bash
Uruchomienie polecenia spowoduje następujące rekurencyjne zachowanie.źródło
Aby zapewnić inny sposób, możesz również po prostu użyć następującego polecenia
źródło
Oto kolejny przykład zapętlenia. Ten zawiera również „instrukcję if” jako przykład sprawdzania, czy wpis jest „plikiem” (lub na przykład „katalogiem”):
źródło
Tutaj można użyć zestawu folderów z deletelist.txt natomiast unikanie pewnych wzorców , jak również
źródło
Dzięki temu nazwy plików będą miały spacje (przykład odtwarzalny).
źródło
W przypadku, gdy ktoś woli
sed
i usuwa bez rozszerzenia symboli wieloznacznych :Przypomnienie: użyj bezwzględnych ścieżek dostępu do pliku lub upewnij się, że jesteś we właściwym katalogu.
A dla kompletności to samo z
awk
:Rozszerzanie symboli wieloznacznych zadziała, jeśli zostaną usunięte pojedyncze cudzysłowy, ale jest to niebezpieczne w przypadku, gdy nazwa pliku zawiera spacje. Wymagałoby to dodania cudzysłowów wokół symboli wieloznacznych.
źródło