Shell脚本:如何删除目录中除了指定文件以外的所有文件?

7
我有一个目录(〜/temp/),其中包含许多文件和子目录,有些目录中可能包含其他文件和子目录。 此外,在目录(〜/temp/)中,它包含一个名为kept.txt的特殊txt文件,列出了一些直接在〜/temp/中包含的文件和子目录,现在我想删除〜/temp/下未在kept.txt文件中列出的所有其他文件和目录,如何使用shell命令实现,越简单越好。
例如:
目录如下:
$ tree temp/ -F
temp/
 ├── a/
 ├── b/
 ├── c/
 │   ├── f2.txt
 │   └── z/
 ├── f1.txt
 └── kept.txt

kept.txt的内容如下:

$ more kept.txt
b
kept.txt

对于这个案例:

  1. 我想要删除 a/c/f1.txt。对于 c/,目录本身和所有子内容(文件和目录)都将被删除。
  2. kept.txt 中,格式是每行一个项目(文件或目录)。
2个回答

5
使用extglob,您可以做到这一点:
cd temp
shopt -s extglob

rm -rf !($(printf "%s|" $(<kept.txt)))

printf "%s|" $(<kept.txt) 将输出 b|kept.txt|,而!(...)是一个扩展的glob模式用于否定匹配。


除了会删除 kept.txt 文件。 - cdarke
不会删除,因为OP在文件kept.txt中也有kept.txt这一行。 - anubhava
我认为OP在第一个编辑中已经展示了more kept.txt(至少在我打开这个问题时是这样的)。 - anubhava
1
@anubhava 很酷! 謝謝。 - manshou

1

将所有内容移动至临时文件夹。移回.txt中列出的文件/目录。最后,删除临时文件夹。


1
是的,这是解决这个问题的一个简单好方法,但我不确定是否有一些简单的命令可以做到这一点。 - manshou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接