Подкатегории MV на один уровень, но не root

У меня есть несколько папок в следующей структуре, которую я хотел бы сортировать.

Например:

/root/sub1/aaaa/bbbb/cccc/dddd /root/sub2/aaaa/bbbb/cccc/dddd /root/sub3/aaaa/bbbb/cccc/dddd /root/sub4/aaaa/bbbb/cccc/dddd 

Это вложенные папки, в которых нет ничего, кроме следующей папки.

Я хочу проложить путь к этому

 /root/sub1/dddd /root/sub2/dddd /root/sub3/dddd /root/sub4/dddd 

Я не хочу переместить папки в корневую папку, но чуть ниже их родительской папки.

Лучшая команда, которую я могу запустить, заключается в следующем:

mv sub*/aaaa/bbbb/cccc/dddd

Однако это приведет все к корневому уровню.

Или я мог бы запускать команду внутри каждой подпапки, но это все равно было бы утомительно.

mv aaaa/bbbb/cccc/dddd

  • KSH / BASH Максимальный размер массива
  • Как сортировать строку, которая в сочетании с строкой + число с использованием сценария bash?
  • Как получить имя блока устройства из имени устройства раздела?
  • Как использовать верхушку в сценарии оболочки для отслеживания потребления памяти процессом?
  • Как проверить, была ли переменная передана функции в Bash?
  • Сценарий Bash для произвольного расширения имени файла
  • Как передать аргумент из сценария bash в 'x-terminal-emulator -e bash -c'?
  • «Stdin: не является tty» почтой для запуска скриптов в качестве заданий cron
  • 2 Solutions collect form web for “Подкатегории MV на один уровень, но не root”

    Поскольку файлы должны заканчиваться в разных каталогах, вам нужно запустить mv несколько раз, по крайней мере один раз в каталоге назначения. Вы можете сделать это, запустив mv в цикле for .

     for x in /root/* do mv -i "$x"/*/*/*/* "$x" done 

    Тело цикла (команда mv ) выполняется для каждой записи в /root каталоге по очереди. При каждом запуске тела цикла "$x" заменяется на путь /root/subN . Команда mv -i "$x"/*/*/*/* "$x" перемещает файл, подобный /root/sub1/aaaa/bbbb/cccc/dddd в каталог /root/sub1 , то есть файл перемещается to /root/sub1/dddd .

    С опцией -i mv спросит, существует ли уже существующий файл назначения, который может произойти, если у вас есть, например, оба: /root/sub1/aaa1/bbb/ccc/ddd и /root/sub1/aaa2/bbb/ccc/ddd .

     find /root -maxdepth 6 -mindepth 6 -type d | awk -F \/ '{ print "mv "$0" "$1"/"$2"/"$3"/"$6 }' | sh 

    Используйте команду find с особым упором на максимальную и минимальную глубину каталогов, затем возьмите листинг и проанализируйте через awk, чтобы построить команду mv, которую мы можем выполнить с помощью sh. Удалите «| sh» для проверки перед добавлением для выполнения.

    Linux и Unix - лучшая ОС в мире.