Я новичок в программировании сценариев оболочки. Предположим, у нас есть файловая иерархия, подобная этой:
/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
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
не позволяет Вам объединять исходный каталог в существующий целевой каталог (но существуют пути вокруг этого).
можно также постараться не выполнять отдельный экземпляр mv
для каждого исходного каталога:
[...] -exec mv -t "$dir" -- {} +