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