Niektóre z nich mogą wymagać dostosowania w zależności od tego, czy masz foldery i co chcesz z nimi zrobić.
Kevin
1
Nie powinno *.!(txt)być !(*.txt)?
Lri,
@LauriRanta zależy od tego, co znajduje się w folderze, na który nie otrzymaliśmy odpowiedzi. Jest w porządku, tak jakby wszystkie pliki miały rozszerzenia i rmdusiłyby się, gdyby były foldery.
Kevin
Mam problem z nawiasami. Kiedy używam stylu globowania w skrypcie bash, narzeka on na błąd składniowy i nawiasy. Działa to jednak z poziomu interfejsu CLI.
CMCDragonkai
1
@izogfif sprawdź, czy to 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
Ntwobike
10
Jeśli chcesz tylko usunąć wszystkie pliki oprócz „* .txt”, możesz użyć następującego polecenia:
@phillipsk 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).
JigglyNaga,
.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.
Dimitry K,
1
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
Witamy w StackExchange! Ta -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.
JigglyNaga
Co xargsma osiągnąć?
wtorek
Dzięki, xargs nie był użyteczny w powyższym przypadku, teraz poprawione.
Surya,
0
Działa to również w celu usunięcia wszystkich ukrytych plików (kropek) i folderów, z wyjątkiem jednego ( .mydir):
ls
przed faktyczną próbą połączeniarm
.Odpowiedzi:
Możesz użyć
find
:Lub rozszerzone funkcje globowania bash:
Lub w Zsh:
źródło
*.!(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 {} \;
źródło
można to zrobić na wiele sposobów. ale najprostszym sposobem byłoby (bash):
źródło
Jedno rozwiązanie bez
find
:To powinno działać na wszelkiego rodzaju powłokach.
źródło
Możesz użyć odwróconego grep i xargs
źródło
ls | grep -v *.txt | xargs rm
działa równie dobrzegrep -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 zls
. (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 plikia.txt
iaatxt
aa-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 testowegols | grep \\.txt$ | xargs --no-run-if-empty echo
(uwaga: nie ma-v
flagi irm=>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 * .txtPodobnie, 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źródło
-I
opcja może być przydatna, ale zobacz, dlaczego nie przeanalizować ls . A co| xargs
osiąga? Bez żadnych argumentów po prostu działaecho
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
):źródło