将特定名称的子目录中的所有文件移动到一个目录级别

时间:2016-02-21 19:06:12

标签: macos bash shell

我运行批处理来调整大小并优化目录和子目录中的所有图像。不幸的是,Photoshop CC没有选项(我知道)覆盖现有图像,而是在处理图像并在其中写入处理过的图像的任何地方创建“JPEG”目录。图像数量相对较大(约2000个图像),并且它们被分成数百个子目录,因此手动移动图像以覆盖现有图像是不可能的。

如何将“JPEG”目录中的所有已处理图像上移一级以覆盖原始图像?关闭我认为我来了就是这样:

find . -type d -name "JPEG" -exec cd {} \; && find . -type f -name "*.jpg" -exec mv -v {} ..  \;

...但是这会将所有图像从当前目录中删除。

有人可以解雇我吗?

2 个答案:

答案 0 :(得分:1)

您的cd仅影响更改为目录并死亡的子流程,而其父流程不受影响。

无论如何,切换到目录很少是必要或有用的;只需在mv命令中直接使用路径。

find . -type d -name "JPEG" -exec mv -v {}/*.jpg {}/..  \;

(不是我现在可以测试的地方,但我猜通配符也需要一个shell:

find . -type d -name "JPEG" -exec sh -c 'mv -v {}/*.jpg {}/..'  \;

显然未经测试。)

答案 1 :(得分:0)

在使用以下脚本之前备份您的映像目录。

CURRENT_DIR=$(pwd)
for x in $(find -type d -name 'JPEG')
do
    cd $x && mv -v *.jpg ..  # you can use `cp` instead of `mv`, then remove JPEG directory.
    cd $CURRENT_DIR
done