2016-09-17 47 views
0

存在我有以下文件夹结构中的文件夹/ 1:Linux命令行删除文件递归其不在其它文件夹

/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文件。

然后我有具有完全相同的子文件夹结构,但多个图像在它然后夹/ 1的文件夹/ 2:

/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 

谢谢!

回答

2

这里是一种与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 

运行一次呼应,如果它会删除正确的文件,如果一切正常,运行它再次有从rm删除echo

+0

我建议追加'||。退出1'到'cd/path/to/2'。 – Cyrus

+0

@Cyrus好主意。 – redneb

+0

@redneb谢谢 - 看起来正是我所需要的。但是我得到:第3行:-r:命令没有找到 – domi771

相关问题