Вы можете сделать это с GNU find
и GNU mv
:
find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +
По сути, способ, который работает, если он find
проходит через все дерево каталогов и для каждого файла ( -type f
), который не находится в каталоге верхнего уровня ( -mindepth 2
), он запускает, mv
чтобы переместить его в каталог, который вы хотите ( -exec mv … +
). -t
Аргумент mv
позволяет указать каталог назначения первым, который необходим , потому что +
форма -exec
помещает все места источника в конце команды. В -i
марке mv
спросить перед перезаписью дубликатов; Вы можете заменить, -f
чтобы перезаписать их, не спрашивая (или -n
не спрашивать или перезаписывать).
Как указывает Стефан Чазелас, вышеприведенное работает только с инструментами GNU (стандартными для Linux, но не для большинства других систем). Следующее несколько медленнее (потому что оно вызывается mv
несколько раз), но гораздо более универсально:
find /dir1 -mindepth 2 -type f -exec mv -i '{}' /dir1 ';'