Це можна зробити за допомогою 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 ';'