使用sudo rm -r时,如何删除除以下文件外的所有文件?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
使用sudo rm -r时,如何删除除以下文件外的所有文件?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
当前回答
只是:
rm $(ls -I "*.txt" ) #Deletes file type except *.txt
Or:
rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf
其他回答
试着这样做:
rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)
但是带空格的名字(一如既往)很难取。也尝试用Virtualbox\ VMs代替引号。它总是删除该目录(Virtualbox vm)。
由于还没有人提到这一点,在一个特定的案例中:
OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES
(或者只是rm $OLD_FILES)
or
OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES
你可能需要使用shop -s nullglob,如果一些文件可能在那里或不在那里:
SET_OLD_NULLGLOB=`shopt -p nullglob`
shopt -s nullglob
FILES=`echo *.sh *.bash`
$SET_OLD_NULLGLOB
如果没有nullglob,则echo *.sh *。Bash可能会给你“a.sh b.sh *. Bash”。
(说了这么多,我自己更喜欢这个答案,即使它在OSX中不起作用)
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
extglob(扩展模式匹配)需要在BASH中启用(如果它没有启用):
shopt -s extglob
不要直接执行命令,请将所需文件移动到当前目录之外的临时目录。然后使用rm *或rm -r *删除所有文件。
然后移动所需的文件到当前目录。
这次行动有点晚了,但希望对那些晚到的人有用……
我发现@awi的答案和jamie Bullock对-delete的评论非常有用。一个简单的实用工具,这样你可以在不同的目录中忽略不同的文件名/类型,每次输入最少:
Rm_except(或任何你想命名的名称)
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
例如,删除除文本文件和foo.bar之外的所有文件:
rm_except *.txt foo.bar
类似于@mishunika,但是没有if子句。