使用 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
的更一般的解决方案:
find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
例如,在当前目录中删除所有非 txt 文件:find . -type f -not -name '*txt' -print0 | xargs -0 rm --
如果要删除文件名中包含空格的文件,就需要使用print0
和-0
组合。
find . -type f -not -name '*ignore1' -not -name '*ignore2' | xargs rm
。 - Siwei-delete
代替-print0 | xargs -0 rm --
。 - Andyrm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
shopt -s extglob
shopt -s extglob; rm -rf !(README|LICENSE)
时,出现 "syntax error near unexpected token `('" 错误提示。你知道是为什么吗? - Dennisbash
之外的其他东西,比如dash
,在那里不支持extglob
。然而,在一个交互式的bash
shell中,该命令也不会按照所述方式工作,尽管原因不同。简而言之:执行shopt -s extglob
;一旦成功启用(使用shopt extglob
验证),则执行rm -rf !(README|LICENSE)
。(当extglob
尚未启用时,!(...)
将由历史扩展评估,然后再执行命令;由于这可能会失败,因此没有任何一个命令被执行,而且extglob
从未被打开。) - mklement0shopt -s extglob
之外,还要在我的脚本文件中重新运行它。这对我解决了问题。 - Ahresserm -rf * .* !(src/|lost+found/)
<-- 它没有按照我的预期工作,它删除了所有东西 ;) - Qbackfind . ! -name "file1" ! -name "file2" -type f -exec rm {} +
This command finds all files in the current directory that are not named "file1" or "file2", and deletes them.
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
这将创建一个备份目录 /tmp_backup
(您拥有根权限,对吧?),将您列出的文件移动到该目录中,递归删除当前目录中的所有内容(您知道您在正确的目录中,对吗?),然后将来自 /tmp_backup
的所有内容移回到当前目录中,并最终删除 /tmp_backup
。
我选择将备份目录放在根目录下,因为如果您试图递归地从根目录中删除所有内容,系统将会出现大问题。
当然还有更优雅的方法来完成此操作,但这种方法非常直接。
find . | egrep -v "\.tex|\.bib" | xargs rm
。 - mtszfind . -maxdepth 1 | grep -v "exclude these" | xargs rm -r
可以更快地工作,因为它不需要不必要地深入到目录中。 - But those new buttons though..find
单独可以完成的工作),如果文件名中包含空格,这将无法按预期工作,并有可能误删文件。 - mklement0/tmp_backup
),但是在执行过程中被中断,那么从用户的角度来看,这个命令并不会很好地结束,除非他们知道去哪里寻找这些文件以便恢复它们。因此,我不赞成这种策略。 - Craig McQueen我更喜欢使用子查询列表:
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
rm -r `ls | grep -v "^textfile.txt$\|^backup.tar.gz$"`
old-textfile.txt
的文件等。 - istepaniuk-v
会显示rm: missing operand
。 - undefined假设在目录树的多个位置中存在具有这些名称的文件,并且您想保留所有这些文件:
find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
你可以在Bash中使用GLOBIGNORE环境变量。
假设你想删除除了php和sql之外的所有文件,那么你可以这样做:
export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=
设置GLOBIGNORE为这样可以忽略通配符中的php和sql,例如"ls *"或"rm *"。因此,在设置该变量后使用"rm *"将仅删除txt和tar.gz文件。
GLOBIGNORE
变量更简单的替代方法是使用子 shell:(GLOBIGNORE='*.php:*.sql'; rm *)
。该命令会在子 shell 中设置 GLOBIGNORE
变量为 '*.php:*.sql'
并删除所有文件。 - mklement0由于没有人提到它:
cp
或 rsync
的权限。无论如何,这只是一种备选方法(作为建议提供),在这里有其存在的价值,作为对 OP 的答案。 - gniourf_gniourffor x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
rm_except *.txt foo.bar
zsh
。rm -rf ^file/folder pattern to avoid
extended_glob
setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
rm -r
所暗示的那样-删除其他所有内容,包括子目录-即使它们包含具有指定名称的文件;或者(b)遍历目标目录的整个子树,在每个目录中删除除列出名称的文件之外的所有文件。 - mklement0.git
而浪费了数天的工作时间,由于没有推送,我无法恢复超过30次提交。确保您排除了所有您关心的内容,包括隐藏文件夹。如果你要处理目录,请设置"-maxdepth 1"。 - Lonami