使用时sudo rm -r
,如何删除所有文件,但以下情况除外:
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
Run Code Online (Sandbox Code Playgroud)
awi*_*awi 214
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
Run Code Online (Sandbox Code Playgroud)
如果您没有指定-type f
find,还会列出您可能不想要的目录.
或者使用非常有用的组合的更通用的解决方案find | xargs
:
find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
Run Code Online (Sandbox Code Playgroud)
例如,删除当前目录中的所有非txt文件:
find . -type f -not -name '*txt' -print0 | xargs -0 rm --
Run Code Online (Sandbox Code Playgroud)
该print0
和-0
是否有任何应该被删除的文件名的空间需要组合.
pl1*_*1nk 149
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
Run Code Online (Sandbox Code Playgroud)
需要在BASH中启用extglob(扩展模式匹配)(如果未启用):
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
dar*_*ioo 40
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
Run Code Online (Sandbox Code Playgroud)
它会创建一个备份目录/tmp_backup
(你有root权限,对吗?),将列出的文件移动到该目录,递归删除当前目录中的所有内容(你知道你在正确的目录中,是吗?),移动回到当前目录,从/tmp_backup
最后删除/tmp_backup
.
我选择备份目录是root用户,因为如果你试图从root中递归删除所有内容,那么你的系统就会遇到很大问题.
当然有更优雅的方法来做到这一点,但这个方法非常简单.
the*_*est 19
您可以在Bash中使用GLOBIGNORE环境变量.
假设您要删除除php和sql之外的所有文件,那么您可以执行以下操作 -
export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=
Run Code Online (Sandbox Code Playgroud)
像这样设置GLOBIGNORE会忽略使用像"ls*"或"rm*"这样的通配符的php和sql.因此,在设置变量后使用"rm*"将仅删除txt和tar.gz文件.
Pau*_*ce. 18
假设具有这些名称的文件存在于目录树的多个位置,并且您希望保留所有这些文件:
find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
Run Code Online (Sandbox Code Playgroud)
Nic*_*sai 16
我更喜欢使用子查询列表:
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
Run Code Online (Sandbox Code Playgroud)
-v, - inverse-match选择不匹配的行
\|
分隔器
既然没有人提到它:
小智 6
你可以为此写一个for循环...%)
for x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
Run Code Online (Sandbox Code Playgroud)
小智 6
对OP来说有点晚了,但希望对谷歌后来到这里的人有用...
我找到了@awi的答案并且@Jamie Bullock对-delete的评论非常有用.一个简单的实用程序,因此您可以在不同的目录中执行此操作,每次使用最少的类型忽略不同的文件名/类型
rm_except(或任何你想要的名字)
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
Run Code Online (Sandbox Code Playgroud)
例如删除除文本文件和foo.bar之外的所有内容:
rm_except *.txt foo.bar
Run Code Online (Sandbox Code Playgroud)
与@mishunika类似,但没有if子句.
如果您使用的zsh
是我强烈推荐的方式。
rm -rf ^file/folder pattern to avoid
Run Code Online (Sandbox Code Playgroud)
用 extended_glob
setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
176198 次 |
最近记录: |