Tak, rm *.xvg
usunie tylko pliki z rozszerzeniem .xvg
w 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 arg3
podczas uruchamiania. W przypadku rm
są 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 *.bar
ten 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 rm
polecenia.
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 **/*.bar
pokaże listę wszystkich plików kończących się .bar
we wszystkich podfolderach. Więc wpisanie rm **/*.bar
bash z włączoną globstar rzeczywiście rekurencyjnie usunie wszystkie pasujące pliki w podfolderach.
rm -f {*.xvg,.*.xvg}
aby usunąć również ukryte pliki. Irm -R -f {*.xvg,.*.xvg}
aby usunąć także katalogi.