我有一个名为a00的目录,其中包含3000个扩展名为.SAC的文件。我有一个名为gd.list的文本文件,其中包含3000个文件中的88个。我正在尝试编写代码,以删除除gd.list
中提到的文件以外的所有.SAC文件。如何使用shell / bash做到这一点?
答案 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文件夹,删除通配符,然后再移回要保留的文件。假设您有能力让这些文件暂时消失。
要使它们在较短时间内消失,请将保存的文件移到临时目录,将原始目录移出,将临时目录移入,然后删除移出的目录。