Вы можете сделать это с 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 ';'