【问题标题】:Linux command line remove files recursively which dont exist in other folderLinux命令行递归删除其他文件夹中不存在的文件
【发布时间】:2016-09-17 09:55:03
【问题描述】:

我在文件夹 /1 中有以下文件夹结构:

/1/1/
  1.png
  2.png
  5.png
  6.png

/1/2/
  3.png
  4.png

/1/3/
  10.png
  11.png
  14.png

本例中有子文件夹 1-3。在现实生活中它的数百个文件夹。每个子文件夹都包含未知数量的 png 文件。

然后我有一个文件夹 /2,它具有完全相同的子文件夹结构,但其中包含更多图像,然后是文件夹 /1:

/2/1/
  1.jpg
  2.jpg
  3.jpg
  4.jpg
  5.jpg
  5.jpg

/2/2/
  1.jpg
  2.jpg
  3.jpg
  4.jpg

/2/3/
  10.jpg
  11.jpg
  12.jog
  13.jpg
  14.jpg

请注意文件夹 2 (.jpg) 中的不同文件扩展名。这些文件的共同点只是文件名。文件夹 /1 和 /2 中的扩展名不同。

我尝试在 Linux 中实现的是清理文件夹 /2 并只保留文件夹 /1 中存在同名文件的图像。

谁能提供我可以从命令行或 bash 脚本使用的命令?

文件夹 /2 中的最终结果应该是:

/2/1/
  1.jpg
  2.jpg
  5.jpg
  6.jpg

/2/2/
  3.jpg
  4.jpg

/2/3/
  10.jpg
  11.jpg
  14.jpg

谢谢!

【问题讨论】:

    标签: linux bash shell command-line


    【解决方案1】:

    这是一种使用 find 和 bash 中的简单 while 循环的方法:

    cd /path/to/2 || exit 1
    find -type f -name '*.jpg' -print0 |
        while IFS= read -r -d '' path; do
            if [[ ! -e "/path/to/1/${path%.jpg}.png" ]]; then
                      # ^^^^^^^^^^ adjust this path
                echo rm -- "$path"
               #^^^^ remove this after the first dry-run
            fi
        done
    

    运行一次以回显是否会删除正确的文件,如果一切正常,请在从 rm 中删除 echo 后再次运行它。

    【讨论】:

    • 我建议将|| exit 1附加到cd /path/to/2
    • @redneb 谢谢 - 看起来正是我需要的。但是我得到:第 3 行:-r:找不到命令
    • @domi771 哎呀,我的错。我放错了read。我现在修好了。
    • 不要在代码中注释“调整此路径”,而是在顶部添加DIR1=${1?} DIR2=${2?}(如果在脚本中),或者在代码中写cd "${DIR2?}"; .. if [[ -e "${DIR1?}${path%.jpg}.png"...
    猜你喜欢
    • 2013-12-06
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2017-08-14
    • 2020-02-04
    • 2012-11-19
    相关资源
    最近更新 更多