![删除除一个文件之外的所有文件/目录](https://linux22.com/image/55236/%E5%88%A0%E9%99%A4%E9%99%A4%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%2F%E7%9B%AE%E5%BD%95.png)
我有一个包含大量文件的目录。我想删除除 file.txt 之外的所有文件。我该怎么做呢?
文件太多,无法单独删除不需要的文件,而且它们的名称也多种多样,无法使用 * 来删除除此文件之外的所有文件。
有人建议使用
rm !(file.txt)
但这不起作用。它返回:
Badly placed ()'s
我的操作系统是 Scientific Linux 6。
有任何想法吗?
答案1
POSIXly:
find . ! -name 'file.txt' -type f -exec rm -f {} +
将删除所有常规文件(递归地,包括隐藏文件),除了任何名为file.txt
.要删除目录,请更改-type f
为-type d
并添加-r
选项rm
。
在bash
, 要使用rm -- !(file.txt)
, 您必须启用extglob:
$ shopt -s extglob
$ rm -- !(file.txt)
(或致电bash -O extglob
)
请注意,extglob
仅适用于bash
Korn shell 系列。并且使用rm -- !(file.txt)
可能会导致Argument list too long
错误。
在 中zsh
,您可以使用^
来否定模式扩展全局启用:
$ setopt extendedglob
$ rm -- ^file.txt
ksh
或使用与和bash
选项相同的语法ksh_glob
并no_bare_glob_qual
启用。
答案2
另一种不同方向的尝试(如果文件名中没有空格)
ls | grep -xv "file.txt" | xargs rm
或(即使文件名中有空格也有效)
ls | grep -xv "file.txt" | parallel rm
从man grep
:
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX)
-x, --line-regexp
Select only those matches that exactly match the
whole line. For a regular expression pattern, this
is like parenthesizing the pattern and then
surrounding it with ^ and $.
如果没有,-x
我们也会保留my-file.txt
。
答案3
维护副本、删除所有内容、恢复副本:
{ rm -rf *
tar -x
} <<TAR
$(tar -c $one_file)
TAR
一行:
{ rm -rf *; tar -x; } <<< $(tar -c $one_file)
但这需要一个支持此处字符串的 shell。
答案4
在我的 Scientific Linux 6 操作系统上,这是有效的:
shopt -s extglob
rm !(file.txt)
我还在虚拟机上安装了 Debian 32 位。上面的方法不起作用,但下面的方法可以:
find . -type f ! -name 'file.txt' -delete