Как переместить все подкаталоги в текущий каталог?

Как переместить все подкаталоги в текущий каталог?

Я новичок в программировании скриптов оболочки. Предположим, у нас есть такая иерархия файлов:

/A/B/C/D
/A/B/E/F/G
/A/H/I
/A/H/J/K

Обратите внимание, что здесь у нас есть не только /A/B/.., но и /A/H/.... Все буквы — это каталоги. Мы хотели бы преобразовать иерархию в:

/A/B/C
/A/B/D
/A/B/E
/A/B/F
/A/B/G
/A/H/I
/A/H/J
/A/H/K

То есть переместить все каталоги на глубине больше двух (dir A имеет глубину ноль) на глубину два. Я могу использовать JAVA и C для реализации этого, но они немного слишком медленные. Кто-нибудь знает, как использовать скрипт оболочки для реализации этого?

Псевдокод выглядит следующим образом:

for each directory D in current directory A // A may have more than one subdirectories
    for each directory d in D
        for each object in d
            if object is a directory
                move object and all descendant subdirectories of object to /A/D;
            end if
        end for
    end for
end for

решение1

for dir in /A/*; do
    find "$dir" -mindepth 2 -depth -type d -exec mv -t "$dir" -- {} +
done

Это предписывает findискать все каталоги ( -type d) как минимум на 2 уровня ниже ( -mindepth 2) $dirв глубину ( -depth). Для каждого найденного объекта он запускает mv -t "$dir" -- <SRC>. Как всегда, mvне позволяет вам объединить исходный каталог с существующим целевым каталогом (но есть способы обойти это).

Связанный контент