删除除一个文件之外的所有文件/目录

删除除一个文件之外的所有文件/目录

我有一个包含大量文件的目录。我想删除除 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仅适用于bashKorn shell 系列。并且使用rm -- !(file.txt)可能会导致Argument list too long错误。

在 中zsh,您可以使用^来否定模式扩展全局启用:

$ setopt extendedglob
$ rm -- ^file.txt

ksh或使用与和bash选项相同的语法ksh_globno_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

相关内容