Shell脚本:如何删除目录中除文件中列出的文件以外的所有文件?

man*_*hou 6 bash shell

我有一个~/temp/包含许多文件和子目录的目录(),在某些目录中,它们可能包含其他文件和子目录.另外,在目录(~/temp/)中,它包含一个带有名称的特殊txt文件kept.txt,它列出了一些包含在其中的直接文件和子目录~/temp/,现在我要删除文件~/temp/中未列出的所有其他文件和目录kept.txt,如何使用shell命令执行此操作,越简单越好.

例如

目录如下:

$ tree temp/ -F
temp/
 ??? a/
 ??? b/
 ??? c/
 ?   ??? f2.txt
 ?   ??? z/
 ??? f1.txt
 ??? kept.txt
Run Code Online (Sandbox Code Playgroud)

内容kept.txt是:

$ more kept.txt
b
kept.txt
Run Code Online (Sandbox Code Playgroud)

对于这种情况:

  1. 我想删除a/,c/和f1.txt.因为c/,目录本身和所有子内容(文件和目录)将被删除.
  2. 在kept.txt,格式是每行一个项目(文件或目录).

anu*_*ava 5

使用extglob你可以这样做:

cd temp
shopt -s extglob

rm -rf !($(printf "%s|" $(<kept.txt)))
Run Code Online (Sandbox Code Playgroud)

printf "%s|" $(<kept.txt)将提供输出 asb|kept.txt|和!(...)是一个扩展的全局模式来否定匹配。