【问题标题】:Deleting all files in a directory except the ones mentioned in a list [duplicate]删除目录中的所有文件,列表中提到的文件除外[重复]
【发布时间】:2018-08-08 16:15:36
【问题描述】:

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

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

【问题讨论】:

标签: linux bash shell


【解决方案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

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

【讨论】:

    【解决方案2】:

    有几种选择。

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

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

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

    对于较小的文件名列表,我建议只使用带有 -and -not -name 和 -delete 的 find,但使用较大的列表可能会很棘手。

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

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

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

    【讨论】:

      【解决方案3】:

      如果你觉得勇敢,试试类似的东西

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

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

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

      【讨论】:

      • 像这样使用 ls 总是很危险的,因为文件名可能有空格。如果有 1 个匹配项,grep 也会倾向于丢弃整行文件名。
      猜你喜欢
      • 2023-03-07
      • 2014-12-12
      • 2021-06-11
      • 1970-01-01
      • 2022-01-22
      • 2019-11-21
      • 2011-05-18
      • 2019-07-11
      • 1970-01-01
      相关资源
      最近更新 更多