перемещение файлов в подкаталогах на один (и *только*) уровень вверх

я пытаюсь переместить файлы, вложенные в подкаталоги, ровно на один уровень. я нахожусь в терминале 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 {} .. \;

но они перемещают файлы относительно корневого каталога, а не каталога, в котором находится сам файл. Другими словами, они перемещают файлы слишком высоко. я хочу, чтобы они поднялись ТОЧНО на один уровень, как бы глубоко они ни были вложены в начале.

кто-нибудь может помочь?


person Ying-sun Ho    schedule 31.08.2015    source источник


Ответы (2)


Это должно решить вашу проблему:

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

Описание:
find ~/container искать внутри этой папки.
-mindepth 3 показывать только файлы, расположенные на 3 каталога ниже.
-type f показывать только файлы (не каталоги).
-execdir выполнять следующую команду для каждого файла внутри его каталога. .
mv "{}" ./.. переместить файл на один каталог вверх.
\; повторить новую команду для каждого выбранного файла.

person Community    schedule 01.09.2015

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

Для каждого файла он находит его имя и перемещает его на один уровень вверх.

** Обновить **

с GNU найти...

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

пока цикл...

find ~/container  -mindepth 3 -type f | while read file; do
     mv "$file" "$(dirname "$file")/.."
done
person Mahesh Kharvi    schedule 31.08.2015
comment
Спасибо! это все еще не работает для меня, хотя. когда я пытаюсь, я получаю это сообщение: xargs: illegal option -- i usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]] - person Ying-sun Ho; 01.09.2015
comment
вы можете использовать старые xargs. Попробуйте xargs -I {} mv "{}" $(dirname "{}")/.. - person Mahesh Kharvi; 01.09.2015
comment
цикл while делает свое дело. Спасибо! если вы хотите, я хотел бы знать, как работает синтаксис для $(dirname $file)/... - person Ying-sun Ho; 01.09.2015
comment
$() — это синтаксис для запуска команды в подоболочке. dirname filename вернет родительский каталог файла и .. переместится оттуда на один уровень вверх - person Mahesh Kharvi; 02.09.2015