删除目录中所有文件,列表中提到的文件除外

时间:2018-08-07 14:44:25

标签: linux bash shell

我有一个名为a00的目录,其中包含3000个扩展名为.SAC的文件。我有一个名为gd.list的文本文件,其中包含3000个文件中的88个。我正在尝试编写代码,以删除除gd.list

中提到的文件以外的所有.SAC文件。

如何使用shell / bash做到这一点?

3 个答案:

答案 0 :(得分:-1)

如果您感觉很勇敢,请尝试类似的

ls *.sac | fgrep -v -f gd.list | xargs echo rm

请注意,我在echo中放入了xargs,只是为了确保没有人发生剪切和粘贴事故。

还要注意注释中提到的这种方法的局限性。如我所说,如果您感到勇敢...

答案 1 :(得分:-1)

rm命令已被注释掉,以便您可以根据需要检查并验证其是否正常运行。然后取消注释该行。

check directory部分将确保您不会意外地从错误的目录运行脚本并破坏错误的文件。

您可以删除echo deleting行以使其静默运行。

#!/bin/bash

cd /home/me/myfolder2tocleanup/

# Exit if the directory isn't found.
if (($?>0)); then
    echo "Can't find work dir... exiting"
    exit
fi

for i in *; do
    if ! grep -qxFe "$i" filelist.txt; then
        echo "Deleting: $i"
        # the next line is commented out.  Test it.  Then uncomment to removed the files
        # rm "$i"
    fi
done

您可以在此处找到L. D. James的答案https://askubuntu.com/questions/830776/remove-file-but-exclude-all-files-in-a-list

答案 2 :(得分:-1)

有几种选择。

我希望看到find -Z,因为它更清楚地标出了文件名:

find .  -maxdepth 1 -name '*.sac' -print0 | grep -x -z -Z -f gd.list | xargs -0 echo rm

再次,先测试一下。也许对输出进行排序,并确保它与原始文件是唯一的。

对于较小的文件名列表,我建议仅将find与-and -not -name和-delete一起使用,但使用较大的列表可能会比较棘手。

您可以将要保留的文件标记为只读,然后在rm中使用适当的设置删除通配符,或者查找跳过只读文件。假定您拥有只读标志。如果不适合您使用只读标志,则可以将文件标记为可执行文件,并使用find。

另一种选择是将匹配的文件移到temp文件夹,删除通配符,然后再移回要保留的文件。假设您有能力让这些文件暂时消失。

要使它们在较短时间内消失,请将保存的文件移到临时目录,将原始目录移出,将临时目录移入,然后删除移出的目录。