Перенести всі файли з підкаталогів у поточний каталог?


14

Як я можу перемістити файли, що містяться у всіх підкаталогах, у поточний каталог, а потім видалити порожні підкаталоги?

Я знайшов це запитання , але адаптувавши відповідь на:

mv * .

не працює; Мені надійшло багато попереджень:

mv: wil and ./wil are identical

Файли, що містяться в підкаталогах, мають унікальні імена.

Відповіді:


23

Ви також можете скористатися -mindepthопцією:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Разом з -maxdepthвами ви також можете обмежити рівні ієрархії, з яких збирати файли.)

Я використовував mv -i("інтерактивний") для mvзапиту перед перезаписом файлів. З великою кількістю підкаталогів можуть виникнути сутички з іменами, про які ви хочете попередити.

--Опція припиняє обробку параметрів, так що mvне лякайтеся іменами файлів , що починаються з дефісом.

Очистіть цілу купу порожніх підкаталогів

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;

Чи є також спосіб пропустити питання про перезапис файлів, не перезаписуючи їх?
Фільнор

2
Параметри для mv:: -n, --no-clobberне перезаписувати існуючий файл. Вас також може зацікавити -b, --backup.
Флоріан Дженн

5

Спробуйте це:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Додаткова інформація: Спробуйте знайти-мітка самостійно, вона повинна дати вам список усіх файлів, які ви хочете перемістити (залиште -print0). Приклад:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

з, -print0і xargsви зараз створюєте список операторів, які слід виконати. В -J %означає прапор, вставка списку елементів тут, так що mv $FILE .виконується для кожного знайденого файлу.

Вище описане працює для BSD xargs. Якщо ви використовуєте GNU-версію (Linux), візьміть -I %замість-J %


0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done

0
mv */* .

Він перемістить усі файли з усіх підкаталогів у поточний каталог.

Якщо вам потрібна чистка, ви можете використати

find . -type d -empty -delete

Це видалить усі порожні підкаталоги.


-2

1 швидкий трюк, працює лише в тому випадку, якщо ваші файли мають розширення (з крапкою):

mv *.* subdir/
mv .* subdir/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.