cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- Pierwsze polecenie przeniesie Cię do katalogu, w którym chcesz usunąć swoje pliki
- Drugie polecenie usunie wszystkie pliki oprócz tych, które kończą się na
.pdf
w nazwie pliku
Na przykład, jeśli temp
w twoim katalogu domowym znajduje się katalog:
cd ~/temp
następnie usuń pliki:
find . -type f ! -iname "*.pdf" -delete
Spowoduje to usunięcie wszystkich plików oprócz xyz.pdf
.
Możesz połączyć te dwa polecenia, aby:
find ~/temp -type f ! -iname "*.pdf" -delete
.
jest bieżącym katalogiem. !
oznacza zabranie wszystkich plików oprócz tych .pdf
na końcu. -type f
wybiera tylko pliki, a nie katalogi. -delete
oznacza go usunąć.
UWAGA: to polecenie usunie wszystkie pliki (oprócz plików pdf, ale także pliki ukryte) w bieżącym katalogu, a także we wszystkich podkatalogach. !
musi przyjść wcześniej -name
. po prostu -name
będzie zawierać tylko .pdf
, podczas gdy -iname
będzie zawierać zarówno .pdf
i.PDF
Aby usunąć tylko w bieżącym katalogu, a nie w podkatalogach, dodaj -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.
oznacza „i”?!
oznacza „oprócz”-name
oznacza, że chcesz wykluczyć za pomocą parametru nazwy, a następnie-delete
czy należy podjąć działanie po znalezieniu? Więc szuka wszystkiego oprócz „* .pdf” i usuwa je? A może źle zrozumiałem?.
oznacza bieżący katalog.!
oznacza, że weźmiesz wszystkie pliki oprócz tego.pdf
na końcu.-delete
oznacza go usunąć. czy jestem teraz czysty?-maxdepth 1
parametr na początek. Następnie zasugeruj usunięcie parametru, jeśli chcesz usunąć rekurencyjnie.-iname
zamiast-name
, albo z plików.PDF
jako rozszerzenie będzie przemknąć.Dzięki
bash
rozszerzeniu globowania powłoki możesz usunąć wszystkie pliki z rozszerzeniami innymi niż.pdf
za pomocąJak zauważono w @pts,
--
znaki wskazują koniec dowolnych opcji poleceń, dzięki czemu polecenie jest bezpieczne w rzadkich przypadkach plików, których nazwy zaczynają się od-
znaku.Jeśli chcesz usunąć pliki bez żadnego rozszerzenia, a także pliki z rozszerzeniami innymi niż
.pdf
, to jak wskazał @DennisWilliamson, możesz użyćRozszerzone globowanie powinno być domyślnie włączone, ale jeśli nie, możesz to zrobić za pomocą
Zwłaszcza, jeśli zamierzasz użyć tego w skrypcie, ważne jest, aby pamiętać, że jeśli wyrażenie nie pasuje do niczego (tj. Jeśli w katalogu nie ma plików innych niż pdf), wówczas domyślnie glob zostanie przekazany do pliku
rm
polecenie, co powoduje błąd podobny doMożesz zmodyfikować to domyślne zachowanie za pomocą
nullglob
opcji powłoki, jednak ma to swój problem. Aby uzyskać dokładniejszą dyskusję, zobacz NullGlob - Wiki Gregaźródło
rm *~*.pdf
!(*.py)
. Prawdopodobnie, jeśli OP chce pozostać tylko plikami „.pdf”, pliki bez rozszerzeń również powinny zostać usunięte i nie powinny być ignorowane.Usuń do kosza :
Lub za pomocą
mv
polecenia (ale w ten sposób nie można przywrócić go z Kosza, ponieważ nie rejestruje on informacji .trashinfo, więc oznacza to, że przeniesiono pliki do miejsca docelowego, w którym znajduje się poniżej).źródło
rm
.Najłatwiejsze podejście: Utwórz gdzieś inny katalog (jeśli usuwasz tylko w jednym katalogu, a nie rekurencyjnie, może to być nawet podkatalog); przenieś tam wszystkie pliki .pdf; usuń wszystko inne; cofnij plik pdf do tyłu; usuń katalog pośredni.
Szybko, łatwo, możesz dokładnie zobaczyć, co robisz. Upewnij się tylko, że katalog pośredni znajduje się na tym samym urządzeniu co katalog, który czyścisz, aby ruchy były nazwami, a nie kopiami!
źródło
Użyj GLOBIGNORE bash:
Ze strony podręcznika użytkownika bash:
Szybki test:
Wynik:
źródło
Bądź ostrożny i skomponuj: użyj xargs
Oto podejście mi się podoba, bo to pozwala mi być bardzo ostrożny: komponować sposób, aby pokazać tylko te pliki, które chcę usunąć, a następnie wysłać je do
rm
korzystaniaxargs
. Na przykład:ls
pokazuje mi wszystkols | grep pdf
pokazuje mi pliki, które chcę zachować. Hmmls | grep -v pdf
pokazuje coś przeciwnego: wszystko oprócz tego, co chcę zachować. Innymi słowy, pokazuje listę rzeczy, które chcę usunąć. Mogę to potwierdzić, zanim zrobię coś niebezpiecznego.ls | grep -v pdf | xargs rm
wysyła dokładnie tę listę dorm
usunięciaJak powiedziałem, podoba mi się to przede wszystkim ze względu na bezpieczeństwo: nie przypadek
rm *
dla mnie. Dwie inne zalety:ls
lub,find
aby uzyskać początkową listę, jak wolisz. Możesz zawęzić wszystko, co chcesz, w trakcie zawężania tej listy - innągrep
, innąawk
lub cokolwiek innego. Jeśli chcesz usunąć tylko pliki, których nazwy zawierają kolor, możesz zbudować go w ten sam sposób.find
do wyszukiwania irm
usuwania, zamiast pamiętać, żefind
akceptuje-delete
flagę. A jeśli to zrobisz, ponownie możesz skomponować alternatywne rozwiązania; może zamiast tegorm
możesz utworzyćtrash
polecenie, które przenosi plik do kosza (umożliwiając „usunięcie”) i potokuje do niego zamiastrm
. Nie potrzebujeszfind
obsługi tej opcji, po prostu do niej potokujesz.Aktualizacja
Zobacz komentarze @pabouk, aby dowiedzieć się, jak to zmienić, aby obsługiwać niektóre przypadki krawędzi, takie jak podziały linii w nazwach plików, nazwy plików
my_pdfs.zip
itp.źródło
pdf
dowolne miejsce w jego nazwie. --- b) Usunie pliki PDF, jeśli dowolna litera w sufiksie jest wielka. --- c) Nie jest dobrym pomysłem używanie wyjścials
. Nie będzie działać z nazwami plików zawierającymi znaki nowej linii. Niektóre implementacjels
zamiany znaków specjalnych, np. Tab by?
. --- Lepiej jest użyć:find -maxdepth 1 -print0
. (nie tak krótki jakls
:) ----- Aby rozwiązać a) ib) użyjgrep -vi '\.pdf$'
--- kompletne (ale tylko GNU) rozwiązanie:find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20
przynajmniej sprawdzić, czy wygląda mniej więcej poprawnie, a jeśli takrm my_pattern
, nie masz szansy na zauważenie dużego błędu.find . -type f ! -name "*.pdf"
do drukowania na konsoli, lub potokuj do mniejszej lub pliku. [a następnie potokuj do xargs do rm, jeśli chcesz, tak jak komentarze pabouk (z -print0 | ... -0 dla dziwnych nazw plików)]Zwykle rozwiązuję takie problemy z interaktywnego interpretera Pythona:
Może być dłuższy niż jednowarstwowy z
find
lubxargs
, ale jest bardzo odporny i wiem dokładnie, co robi, bez konieczności wcześniejszego badania.źródło
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
lepszą odpowiedzią (w porównaniu do mojej poprzedniej odpowiedzi) na to pytanie będzie użycie potężnego
file
polecenia.teraz twój problem:
zadaniem
for
polecenia jest podanie plików w bieżącym katalogu w postaci zmiennej$var
.if-then
polecenie wyświetla nazwy plików pdf, biorąc status wyjścia0
zfile -i "$var" | grep -q 'application/pdf\;'
polecenia, daje status wyjścia0
tylko wtedy, gdy znajdzie pliki pdf.źródło
Ostrzeżenie! Lepiej najpierw spróbuj
źródło
-i
zgrep
do dopasowywania bez rozróżniania wielkości liter.Czytaj jako, usuń wszystkie pliki, które nie są
a.pdf
lubx.pdf
.Działa poprzez wykorzystanie 2 wydłużonych globs zewnętrzna
!()
negacji zawartego glob, który z kolei wymaga, aby do wzorca, musi być zgodny z jednym lub więceja
lubx
stanie przed.pdf
końcówką. Zobacz glob # extglob .źródło
przenośny sposób powłoki
Dość dużo POSIX i kompatybilny z dowolnym powłoce Bourne'a Style (
ksh
,bash
,dash
). Dobrze nadaje się do przenośnych skryptów i gdy nie możesz użyćbash
rozszerzonego globowania powłoki.perl:
Lub nieco czystszy:
alternatywny python
źródło
Uważaj na to, co usuwasz!
Bezpiecznym sposobem przetestowania go przed próbą usunięcia jest przetestowanie go najpierw
ls
, ponieważ niektóre nieprzechwycone zachowania mogą usuwać niechciane pliki. Możesz to zrobić bezpośrednio poza katalogiem.ls
jest podobny dorm
, więc:Spowoduje to wyświetlenie listy
Teraz możesz zobaczyć, co usuwasz, i możesz je bezpiecznie usunąć:
I to wszystko. Możesz używać symboli wieloznacznych,
*
aby być bardziej selektywnym, tak jak przechowywanie tylko dokumentów kursu programowania:źródło