Wiem, jak usunąć cały txt
plik z bieżącego katalogu przez rm *.txt
. Czy ktoś wie, jak usunąć wszystkie pliki w bieżącym katalogu z wyjątkiem txt
pliku?
Wiem, jak usunąć cały txt
plik z bieżącego katalogu przez rm *.txt
. Czy ktoś wie, jak usunąć wszystkie pliki w bieżącym katalogu z wyjątkiem txt
pliku?
Odpowiedzi:
Możesz użyć find
:
find . -type f ! -name '*.txt' -delete
Lub rozszerzone funkcje globowania bash:
shopt -s extglob
rm *.!(txt)
Lub w Zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)
być !(*.txt)
?
rm
dusiłyby się, gdyby były foldery.
find . -type f ! -name "*.txt" | xargs -r rm
zadziała w GNU \ xargs. Komenda xargs w BSD i UNIX może nie mieć -r musisz sprawdzić swój lokalnyman xargs
Jeśli chcesz tylko usunąć wszystkie pliki oprócz „* .txt”, możesz użyć następującego polecenia:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
ale jeśli chcesz również usunąć katalogi wraz z plikami, możesz użyć tego:
$ find . ! -name "*.txt" -exec rm -r {} \;
Możesz użyć odwróconego grep i xargs
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
działa równie dobrze
grep -v *.txt
będzie działać tylko wtedy, gdy będzie dokładnie jeden .txt
plik. Jeśli nie ma, grep
użyje *.txt
jako wzorca; jeśli jest więcej niż jeden, wyszuka pierwszą nazwę pliku we wszystkich pozostałych .txt
plikach, ignorując dane wyjściowe z ls
. (Dokładne wyniki mogą zależeć od opcji globu powłoki).
.txt$
dopasuje ciągi znaków kończące się txt
niezależnie od kropki. Ponieważ grep
jako wyrażenie przyjmuje wyrażenie regularne. Więc pliki a.txt
i aatxt
a a-txt
wszystko będzie towarzyszyć tej wypowiedzi. Prawidłowe wyrażenie powinno być ls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Dla ciekawskich: jeśli chcesz bezpiecznie bawić się wyrażeniem, użyj tego wyrażenia testowego ls | grep \\.txt$ | xargs --no-run-if-empty echo
(uwaga: nie ma -v
flagi i rm=>echo
). Uwaga 2: mogłeś zauważyć podwójny ukośnik odwrotny. Jeden służy do wyrażenia regularnego, drugi do basha, aby uniknąć ukośnika.
Po prostu wykonaj:
rm $(ls -I "*.txt" )
# Usuwa typ pliku oprócz * .txt
Podobnie, jeśli trzeba usunąć „oprócz jednego lub więcej typów plików”, wykonaj:
rm $(ls -I "*.txt" -I "*.pdf" )
# Usuwa typy plików oprócz * .txt i * .pdf
-I
opcja może być przydatna, ale zobacz, dlaczego nie przeanalizować ls . A co | xargs
osiąga? Bez żadnych argumentów po prostu działa echo
na wszystkich danych wejściowych.
xargs
ma osiągnąć?
Działa to również w celu usunięcia wszystkich ukrytych plików (kropek) i folderów, z wyjątkiem jednego ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
przed faktyczną próbą połączeniarm
.