BASH:如何删除清单中指定的文件以外的所有文件?

bri*_*ice 19 unix bash scripting find

我有一个清单文件,它只是换行符分隔的文件名列表.如何从文件夹中删除清单中命名的所有文件?

我试图find ./ ! -name "filename"动态构建一个命令:

command="find ./ ! -name \"MANIFEST\" "
for line in `cat MANIFEST`; do
    command=${command}"! -name \"${line}\" " 
done
command=${command} -exec echo {} \;
$command
Run Code Online (Sandbox Code Playgroud)

但文件仍然存在.

[注意:]我知道这使用echo.我想在使用它之前检查我的命令.

解决方案:(感谢PixelBeat)

ls -1 > ALLFILES
sort MANIFEST MANIFEST ALLFILES | uniq -u | xargs rm
Run Code Online (Sandbox Code Playgroud)

没有临时文件:

ls -1 | sort MANIFEST MANIFEST - | uniq -u | xargs rm
Run Code Online (Sandbox Code Playgroud)

两者都忽略文件是否已排序.

Jür*_*zel 14

对于当前目录中的每个文件,MANIFEST文件中的grep文件名和rm 文件(如果不匹配).

for file in *
  do grep -q -F "$file" PATH_TO_YOUR_MANIFIST ||  rm "$file" 
done
Run Code Online (Sandbox Code Playgroud)


pix*_*eat 13

使用http://www.pixelbeat.org/cmdline.html#sets中的"设置差异"模式

(find ./ -type f -printf "%P\n"; cat MANIFEST MANIFEST; echo MANIFEST) |
  sort | uniq -u | xargs -r rm
Run Code Online (Sandbox Code Playgroud)

注意我列出两次MANIFEST,以防有列出的文件实际上不存在.另请注意,上面支持子目录中的文件


bri*_*ice 5

弄清楚了:

ls -1 > ALLFILES
comm -3 MANIFEST ALLFILES | xargs rm
Run Code Online (Sandbox Code Playgroud)

  • 是com -3等效于我上面的解决方案。但是要小心,因为通讯期望已排序的输入 (2认同)