Usuwanie określonych plików z wiersza poleceń

8

Mam pliki nazwa_pliku_1 , nazwa_pliku_2 ... nazwa_pliku_100000, gdzie nazwy plików są numerowane kolejno. Jak mogę usunąć pliki indeksu większe niż, powiedzmy 100 ?

herbata
źródło

Odpowiedzi:

17

Jeśli nazwy plików są numerowane kolejno, po prostu uruchom następujące polecenie:

rm fileName_{100..100000}
cioby23
źródło
3
Informacja: Działa, ponieważ bash (twoja powłoka) rozszerzy {x..y}całą listę. Na przykład, jeśli echo test{1..3}go użyjesz , zostanie rozwinięty, echo test1 test2 test3a następnie wykonany. Jak widać, drukuje test1 test2 test3. Podobnie, jeśli {x..y}nie jest powiązany z żadnym argumentem, po prostu wstawi tam liczby. Np. Po echo test {1..3}prostu wydrukuje test 1 2 3.
Luc
1
Uwaga: execwywołanie narzuca limit liczby argumentów, które może mieć proces. Możesz go odzyskać za pomocą getconf ARG_MAX. Na przykład w moim systemie jest to 2097152(~ 2,1 miliona). Oznacza to, że rm(co nie jest wbudowane) zakończy się niepowodzeniem przy większej liczbie plików. Wbudowane polecenia nie mają tego problemu, podobnie jak inne proponowane rozwiązania.
Bakuriu
Zauważ, że ARG_MAX jest liczbą bajtów, a nie liczbą argumentów. rm nie może obsłużyć usuwania plików 2097152 jednocześnie. Może usunąć 2048 plików, z których każdy ma nazwę o długości 1023 bajtów (nie 1024; ograniczniki między argumentami (\ 0 w C-land) liczą się do limitu).
godlygeek
6

Możesz spróbować tego polecenia również,

for i in $(seq 100 100000); do rm fileName_$i; done

Usunie wszystkie pliki (zakres od 100 do 100000), jeśli nazwa pliku zawiera liczby w kolejności sekwencyjnej.

Avinash Raj
źródło
5

Ogólnie można to osiągnąć na kilka sposobów:

rm fileName_{100..100000}

zostanie rozszerzony przez powłokę do około 100 000 nazw plików. Jeśli basename jest długą ścieżką, a liczba jest wystarczająco wysoka, możesz faktycznie przekroczyć maksymalną długość linii poleceń przy takim podejściu.

forpętla

for i in $(seq 100 100000); do rm fileName_$i; done

nie cierpi z powodu tego problemu, ale jest stosunkowo powolnym sposobem usuwania plików, ponieważ powłoka musi wykonać podstawienie zmiennej i uruchomić rm około 100 000 razy.

Obie powyższe metody mogą powodować ostrzeżenia, jeśli na przykład filename_101brakuje niektórych plików .

Zwykle rozwiązania oparte na find są lepsze, ponieważ działają tylko na plikach, które faktycznie tam są (podczas wykrywania). Istnieją jednak pewne subtelne różnice:

find . -name 'fileName_[100-100000]' -exec rm {} \;

nadal uruchomi rm program około 100 000 razy, a zastępując końcowy \;przez +, spróbuje zminimalizować liczbę podprocesów. Obie metody będą prawdopodobnie (znacznie lub nieco) wolniejsze niż użycie, -deletektóre w ogóle nie używa poleceń zewnętrznych, ale wywołuje wywołania systemowe.

Jednak zawsze najpierw sprawdzić, czy wzór faktycznie pasuje do plików, które chcesz kierować:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

W takim przypadku usunąłbyś plik, który chcesz zachować, i pozostawiłeś pliki, które powinny zostać usunięte.

Stefan Schmiedl
źródło
4

Użyj następującego polecenia:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Spowoduje to usunięcie plików od 100 do 100000.

Więcej informacji: Witryna

nux
źródło
Lepiej byłoby użyć +, niż \;- patrz tutaj . Lub, jeszcze lepiej, użyj -deletepolecenia find .
evilsoup
Testowałem to i usunąłem tylko fileName_1. [100-100000] Klasa charakter jedynie dopasowuje pojedynczy znak, więc może tylko dopasować 0 lub 1.
deltab