Linux 删除目录中除列表中提到的文件以外的所有文件
我有一个名为a00的目录,其中包含3000个扩展名为.SAC的文件。我有一个名为gd.list的文本文件,其中包含这3000个文件中88个文件的名称。我正在尝试编写一个代码,删除除gd.list中提到的那些文件之外的所有.SAC文件Linux 删除目录中除列表中提到的文件以外的所有文件,linux,bash,shell,Linux,Bash,Shell,我有一个名为a00的目录,其中包含3000个扩展名为.SAC的文件。我有一个名为gd.list的文本文件,其中包含这3000个文件中88个文件的名称。我正在尝试编写一个代码,删除除gd.list中提到的那些文件之外的所有.SAC文件 如何使用shell/bash实现这一点?如果你觉得自己很勇敢,可以尝试以下方法 ls *.sac | fgrep -v -f gd.list | xargs echo rm 请注意,我在xargs中放置了一个echo,以确保没有人发生剪切粘贴事故 还要注意评论中提
如何使用shell/bash实现这一点?如果你觉得自己很勇敢,可以尝试以下方法
ls *.sac | fgrep -v -f gd.list | xargs echo rm
请注意,我在xargs
中放置了一个echo
,以确保没有人发生剪切粘贴事故
还要注意评论中提到的这种方法的局限性。正如我所说的,如果您感到勇敢…那么
rm
命令将被注释掉,以便您可以检查并验证它是否在需要时工作。那就取消对那句话的评论吧
检查目录
部分将确保您不会意外地从错误的目录运行脚本并删除错误的文件
您可以删除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的答案,这里有几种选择 我更愿意看到
find-Z
,因为它更清楚地划分了文件名:
find . -maxdepth 1 -name '*.sac' -print0 | grep -x -z -Z -f gd.list | xargs -0 echo rm
再次,首先测试这个。也许可以对输出进行排序,并确保它与原始文件是唯一的
对于较小的文件名列表,我建议只使用find with-and-not-name and-delete,但是使用较大的列表可能会比较棘手
您可以将要保留的文件标记为只读,然后在rm中使用适当的设置删除通配符,或查找以跳过只读文件。假设您拥有只读标志。如果只读标志不适合您,您可以将文件标记为可执行文件,并使用find
另一种选择是将匹配的文件移动到临时文件夹,删除通配符,然后移动要保留的文件。这是假设您可以负担文件暂时消失的费用
要使它们在较短的时间内消失,请将保留的文件移出到临时目录,移出原始目录,移入临时目录,然后删除移出的目录。像这样使用ls总是很危险的,因为文件名可能有空格。此外,如果有一个匹配项,grep将倾向于丢弃整行文件名。请避免“给我代码”问题,因为这些问题已经被问了很多次,并且回答了很多次,您必须努力避免找到答案。而是显示您正在处理的脚本,并说明问题所在。也看到