Wiem, jak usunąć cały txtplik z bieżącego katalogu przez rm *.txt. Czy ktoś wie, jak usunąć wszystkie pliki w bieżącym katalogu z wyjątkiem txtpliku?
Wiem, jak usunąć cały txtplik z bieżącego katalogu przez rm *.txt. Czy ktoś wie, jak usunąć wszystkie pliki w bieżącym katalogu z wyjątkiem txtpliku?
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)?
rmdusiłyby się, gdyby były foldery.
find . -type f ! -name "*.txt" | xargs -r rmzadział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 rmdziała równie dobrze
grep -v *.txtbędzie działać tylko wtedy, gdy będzie dokładnie jeden .txtplik. Jeśli nie ma, grepużyje *.txtjako wzorca; jeśli jest więcej niż jeden, wyszuka pierwszą nazwę pliku we wszystkich pozostałych .txtplikach, 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ę txtniezależnie od kropki. Ponieważ grepjako wyrażenie przyjmuje wyrażenie regularne. Więc pliki a.txti aatxta a-txtwszystko 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 -vflagi 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
-Iopcja może być przydatna, ale zobacz, dlaczego nie przeanalizować ls . A co | xargsosiąga? Bez żadnych argumentów po prostu działa echona wszystkich danych wejściowych.
xargsma 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")
lsprzed faktyczną próbą połączeniarm.