2015-08-31 3 views
0

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

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

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

ответ

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

Для каждого файла он находит имя 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 
+0

спасибо! Тем не менее, он все еще не работает для меня. когда я пытаюсь, я получаю это сообщение: 'xargs: незаконный вариант - i использование: xargs [-0opt] [-E eofstr] [-I replstr [-R замены]] [-J replstr] [- L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]] ' –

+0

Возможно, вы используете старшие xargs. Попробуйте 'xargs -I {} mv" {} "$ (dirname" {} ")/..' –

+0

цикл while делает трюк. большое спасибо! если вы согласны, мне бы хотелось узнать, как работает синтаксис «$ (dirname« $ file »)/..». –

3

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

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

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