将子目录中的文件移动到一个(和*仅*一个)级别

时间:2015-08-31 03:44:17

标签: bash directory mv subdirectory

我正在尝试将嵌套在子目录中的文件移动到一个级别。我在os x终端,并且是bash的新手。我很确定这很简单,我只是不知道该怎么做。

我想更改一个如下所示的文件结构:

~/container
       /1-A
           LEVEL 1 - 000.jpg
           LEVEL 1 - 001.jpg
           LEVEL 1 - 002.jpg
       /1-B
           /2-A
               LEVEL 2 - 007.jpg
               LEVEL 2 - 008.jpg
               LEVEL 2 - 009.jpg
       /1-C
           LEVEL 1 - 003.jpg
           LEVEL 1 - 004.jpg
           LEVEL 1 - 005.jpg
           LEVEL 1 - 006.jpg
       /1-D
           /2-C
               LEVEL 2 - 010.jpg
               LEVEL 2 - 011.jpg
               LEVEL 2 - 012.jpg
               LEVEL 2 - 013.jpg
               LEVEL 2 - 014.jpg
       /1-E
           LEVEL 1 - 015.jpg
           LEVEL 1 - 016.jpg
           LEVEL 1 - 017.jpg
       /1-F
           /2-B
               /3-A
                   LEVEL 3 - 018.jpg
                   LEVEL 3 - 019.jpg
                   LEVEL 3 - 020.jpg
                   LEVEL 3 - 021.jpg

看起来像这样:

~/container
       /1-A
           LEVEL 1 - 000.jpg
           LEVEL 1 - 001.jpg
           LEVEL 1 - 002.jpg
       /1-B
           LEVEL 2 - 007.jpg
           LEVEL 2 - 008.jpg
           LEVEL 2 - 009.jpg
           /2-A
       /1-C
           LEVEL 1 - 003.jpg
           LEVEL 1 - 004.jpg
           LEVEL 1 - 005.jpg
           LEVEL 1 - 006.jpg
       /1-D
           LEVEL 2 - 010.jpg
           LEVEL 2 - 011.jpg
           LEVEL 2 - 012.jpg
           LEVEL 2 - 013.jpg
           LEVEL 2 - 014.jpg
           /2-C
       /1-E
           LEVEL 1 - 015.jpg
           LEVEL 1 - 016.jpg
           LEVEL 1 - 017.jpg
       /1-F
           /2-B
               LEVEL 3 - 018.jpg
               LEVEL 3 - 019.jpg
               LEVEL 3 - 020.jpg
               LEVEL 3 - 021.jpg 
               /3-A

我试过了:

find ~/container  -mindepth 3 -type f -exec mv {} . \;

find ~/container  -mindepth 3 -type f -exec mv {} .. \;

但是这些文件相对于根目录移动文件,而不是文件本身所在的目录。换句话说,它们将文件移动得太远了。我希望他们完全向上移动一级,但是他们要先深入嵌套。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

这可以解决您的问题:

find ~/container -mindepth 3 -type f -execdir mv "{}" ./.. \;

描述:
find ~/container在此文件夹中搜索 -mindepth 3仅显示3个目录的文件 -type f仅显示文件(不是目录) -execdir对其目录中的每个文件执行以下命令 mv "{}" ./..将文件移到一个目录。
\;为所选的每个文件重复一个新命令。

答案 1 :(得分:0)

find ~/container  -mindepth 3 -type f | xargs -i bash -c 'mv "{}" $(dirname "{}")/..'

对于每个文件,它会找到它的dirname并将其向上移动一级。

**更新**

使用GNU查找...

find ~/container  -mindepth 3 -type f  -execdir mv "{}" $(dirname "{}")/.. \;

while loop ...

find ~/container  -mindepth 3 -type f | while read file; do
     mv "$file" "$(dirname "$file")/.."
done