Linux命令行递归删除其他文件夹中不存在的文件

Linux命令行递归删除其他文件夹中不存在的文件,linux,bash,shell,command-line,Linux,Bash,Shell,Command Line,我在文件夹/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 /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

我在文件夹/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
/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
本例中有子文件夹1-3。在RealLive中,它有数百个文件夹。每个子文件夹中都包含未知数量的png文件

然后,我有一个文件夹/2,其子文件夹结构与文件夹/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
/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

谢谢大家!

下面是一种使用
find
和一个简单的
while
循环在bash中执行此操作的方法:

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

如果要删除正确的文件,请运行一次echo,如果一切正常,在从
rm

删除
echo
后再次运行它。下面是一种在bash中使用
find
和一个简单的
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

如果要删除正确的文件,请运行一次echo,如果一切正常,请在从
rm
删除
echo
后再次运行它。我建议将
|退出1
附加到
cd/path/to/2
@redneb谢谢-看起来正是我需要的。但是我得到:第3行:-r:命令不是found@domi771哎呀,我的错。我把
读的
放错地方了。我现在修复了它。与其在代码中深度嵌入注释“调整此路径”,不如在顶部添加
DIR1=${1?}DIR2=${2?}
(如果在脚本中),或者在代码写入
cd“${DIR2?}”。。如果[[-e“${DIR1?}${path%.jpg}.png”…
我建议将
|退出1
附加到
cd/path/to/2
@redneb谢谢-看起来正是我需要的。但是我得到的是:第3行:-r:命令不是found@domi771哎呀,我的错。我把
读的
放错地方了。我现在把它修好了。而不是评论“调整此路径”深入嵌入代码中,可以在顶部添加
DIR1=${1?}DIR2=${2?}
(如果在脚本中),或者在代码写入
cd“${DIR2?}”;…如果[[-e”${DIR1?}${path%.jpg}.png”…