Jak mogę usunąć wszystkie pliki z określonym rozszerzeniem w określonym folderze?

36

Jeśli ustawię bieżący / roboczy katalog (nawigując do niego za pomocą cd) do jakiegoś konkretnego katalogu, a następnie wpisz:

rm *.xvg

Co zrobi to polecenie? Czy to prawda, że ​​powyższe polecenie usuwa tylko pliki z rozszerzeniem .xvg tylko w katalogu roboczym?

Byłem zdenerwowany próbowaniem tego przed zapytaniem, ponieważ chcę mieć absolutną pewność, że powyższe polecenie usunie tylko .xvgpliki ZLOKALIZOWANE W KATALOGU PRACY .

Andrzej
źródło

Odpowiedzi:

34

Tak, rm *.xvgusunie tylko pliki o określonym rozszerzeniu z bieżącego katalogu.

Dobry sposób, aby upewnić się, że rzeczywiście są w katalogu, który chcesz usunąć pliki jest użycie pwdpolecenia, które spowoduje wyświetlenie aktualnego katalogu, a następnie zrobić ls, aby zweryfikować znaleźć pliki, które oczekują.

Jeśli obawiasz się wydania rmpolecenia, możesz zrobić 2 rzeczy:

  1. wpisz, ls *.xvgaby zobaczyć listę plików, na które to polecenie miałoby wpływ.

  2. Jeśli nie masz wielu plików, zawsze możesz również użyć -iprzełącznika wiersza polecenia dla rm(istnieje również dla cpi mv). Użycie rm -i *.xvgspowoduje wyświetlenie monitu o każdy pojedynczy plik, jeśli można go usunąć, więc możesz mieć pewność, że nic, czego się nie spodziewałeś, zostanie usunięte. (To będzie nudne, jeśli masz dużo plików :)

Levon
źródło
1
Ponadto: rm -f {*.xvg,.*.xvg}aby usunąć również ukryte pliki. I rm -R -f {*.xvg,.*.xvg}aby usunąć także katalogi.
Dor
20

Nie musisz nawigować do katalogu, po prostu użyj

rm /some/dir/*.xvg 

W przypadku literówki lub podobnego błędu na ścieżce, gdzie / som / dir nie istnieje:

cd /som/dir
rm *.xvg

przypadkowo usunie wszystkie pliki .xvg w bieżącym katalogu. Pierwsze polecenie nie, i nie trzeba ponownie odtwarzać dysku CD.

Alternatywnym sposobem byłoby użycie find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
nieznany użytkownik
źródło
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete zadziałało dla mnie! użyj -maxdepth "n", aby usunąć pasujące pliki w podkatalogu, jeśli podano ścieżkę
Vinay
3

Tak, rm *.xvgusunie tylko pliki z rozszerzeniem .xvgw bieżącym katalogu. Dlatego.

Gdy wpiszesz takie polecenie, praca zostanie podzielona między używaną powłokę (załóżmy bash) i polecenie binarne.

Możesz zlokalizować plik binarny, pisząc which rm. Ten mały program zajmuje się rozłączaniem plików. Takie programy można uruchamiać z wiersza poleceń i mogą czytać listę argumentów prog arg1 arg2 arg3podczas uruchamiania. W przypadku rmsą one interpretowane jako lista w pełni kwalifikowanych nazw plików do usunięcia. Więc jeśli jesteś w katalogu zawierającym plik foo.bar, wpisanie delete 'foo.*'spowoduje rm: foo.*: No such file or directory. Zwróć uwagę na pojedyncze cudzysłowy wokół wzorca pliku, nakazują powłoce przekazanie argumentu do powłoki w jej obecnej postaci.

Jeśli jednak wpiszesz rm *.barten sam katalog, plik zostanie usunięty. To, co się tu dzieje, polega na tym, że twoja powłoka, której używasz do wpisywania poleceń, wykonuje pewne transformacje przed przekazaniem argumentów do polecenia. Jeden z nich nazywa się „rozwijaniem nazw plików”, inaczej znany jako „globbing”. Można wyświetlić listę plików bash rozszerzeń nazw tutaj . Jednym z najczęstszych rozszerzeń *jest rozszerzenie nazw plików w bieżącym katalogu.

Prostym sposobem na sprawdzenie globów w pracy jest użycie echo, które wypisuje wszystkie argumenty przekazane mu przez powłokę. Więc wpisanie echo *w tym samym katalogu da wynik foo.bar. Więc kiedy piszesz rm *.bar, to tak naprawdę dzieje się tak, że powłoka rozwija listę argumentów do foo.bar, a następnie przekazuje ją do rmpolecenia.

Istnieje kilka sposobów kontrolowania globowania. Na przykład w najnowszych wersjach bash możesz włączyć opcję o nazwie globstar, która spowoduje rekursywną ekspansję. Wpisanie echo **/*.barpokaże listę wszystkich plików kończących się .barwe wszystkich podfolderach. Więc wpisanie rm **/*.barbash z włączoną globstar rzeczywiście rekurencyjnie usunie wszystkie pasujące pliki w podfolderach.

purzelrakete
źródło
1

Dowództwo :

  rm ./*.pgm

pracuje dla mnie

Dowództwo:

rm *.pgm

wydaje polecenie błędu (po polsku, przetłumaczone):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

w

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Adam
źródło