所有的文件除了一些
使用sudo rm -r
,如何删除所有文件,但以下情况除外:
textfile.txt backup.tar.gz script.php database.sql info.txt
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
如果你不指定-type f
find也会列出你不想要的目录。
或者使用非常有用的组合find | xargs
的更一般的解决scheme find | xargs
:
find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
例如,删除当前目录中的所有非txt文件:
find . -type f -not -name '*txt' -print0 | xargs -0 rm --
如果任何应该删除的文件名中有空格,则需要print0
和-0
组合。
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
需要在BASH中启用extglob(扩展模式匹配)(如果未启用):
shopt -s extglob
find . | grep -v "excluded files criteria" | xargs rm
这将列出当前目录中的所有文件,然后列出所有不符合条件的文件(注意与目录名称匹配),然后删除它们。
更新 :基于你的编辑,如果你真的想从当前目录中删除你列出的文件以外的所有东西,可以使用:
mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup
它会创build一个备份目录/tmp_backup
(你有root权限,对吧?),把你列出的文件移动到那个目录下,recursion地删除当前目录中的所有内容(你知道你在正确的目录下,是吗? ,从/tmp_backup
回到当前目录,最后删除/tmp_backup
。
我select备份目录是根目录,因为如果你想从根目录recursion删除所有的东西,你的系统将会有很大的问题。
当然,有更多的优雅的方式来做到这一点,但这是非常简单的。
假设具有这些名称的文件存在于目录树中的多个位置,并且要保留所有这些文件:
find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
你可以在Bash中使用GLOBIGNORE环境variables。
假设你想删除除php和sql之外的所有文件,那么你可以执行以下操作 –
export GLOBIGNORE=*.php:*.sql rm * export GLOBIGNORE=
像这样设置GLOBIGNORE会忽略像“ls *”或“rm *”这样的通配符的php和sql。 因此,设置variables后使用“rm *”将只删除txt和tar.gz文件。
由于没有人提到它:
- 将您不想删除的文件复制到安全的地方
- 删除所有的文件
- 将复制的文件移回原位
有点迟到的OP,但希望有用的人谁得到更多的后来谷歌…
我通过@awifind了答案,并且@Jamie Bullock评论了这个答案真的很有用。 一个简单的实用程序,所以你可以在不同的目录下做到这一点,忽略不同的文件名/types,每次最less的打字:
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子句。
你可以写一个for循环这个…%)
for x in * do if [ "$x" != "exclude_criteria" ] then rm -f $x; fi done;
尝试使用它:
rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)
但有空格的名字是(一如既往)艰难。 也尝试使用Virtualbox\ VMs
而不是引号。 它总是删除那个目录( Virtualbox VMs
)。
我更喜欢使用子查询列表:
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
-v,–invert-matchselect不匹配的行
\|
分隔器
如果你使用的是我强烈推荐的zsh
。
rm -rf ^file/folder pattern to avoid
用extended_glob
setopt extended_glob rm -- ^*.txt rm -- ^*.(sql|txt)
只是:
rm $(ls -I "*.txt" ) #Deletes file type except *.txt
要么:
rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf
这与@ siwei-shen的评论类似,但是你需要-o
标志来做多种模式。 -o
标志代表“或”
find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm
你可以使用行命令来做到这一点,首先定义一个数组,你不想排除的文件的名称
$ files=( backup.tar.gz script.php database.sql info.txt )
在循环遍历要排除的目录中的所有文件之后,检查文件名是否在arrays中,而不是要排除,如果不存在,则删除该文件。
$ for file in $(ls); do if [[ ! " ${files[@]} " ~= "$file" ]];then rm "$file";fi;done
就是这个!
而不是去直接的命令,请将所需的文件移动到当前目录以外的临时目录。 然后使用rm *
或rm -r *
删除所有文件。
然后将所需的文件移动到当前目录。