Переместить все файлы из подкаталогов в текущий каталог?
Как перемещать файлы, содержащиеся во всех подкаталогах, в текущий каталог, а затем удалять пустые подкаталоги?
Я нашел этот вопрос , но приспособив ответ на:
mv * .
не работал; Я получил много предупреждений, похожих на:
- В bash, как я могу переименовать файл, не повторяя путь?
- Возможно ли переместить / переименовать файлы в Git и сохранить их историю?
- Рекурсивные перемещения файлов определенного типа на определенный путь
- Как переименовать с префиксом / суффикс?
- Как перенести все файлы из текущего каталога в верхний каталог?
mv: wil and ./wil are identical
Файлы, содержащиеся в подкаталогах, имеют уникальные имена.
Вы также можете использовать опцию -mindepth
:
find . -type f -mindepth 2 -exec mv -i -- {} . \;
(Вместе с -maxdepth
вы также можете ограничить уровни иерархии, из которых можно собирать файлы.)
Я использовал mv -i
(«interactive»), чтобы запросить mv
перед перезаписью файлов. С большим количеством подкаталогов могут возникнуть столкновения имен, о которых вы хотели бы предупредить.
Опция --
останавливает опцию обработки, поэтому mv
не путается именами файлов, начинающимися с дефиса.
Очистите все пустые подкаталоги с помощью
find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Попробуй это:
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 .
Выполняется для каждого найденного файла.
Вышеуказанное работает для xargs BSD. Если вы используете GNU-версию (Linux), возьмите -I %
вместо -J %
Баш 4:
shopt -s globstar for file in **; do [[ -f "$file" ]] && mv "$file" .; done
1 быстрый трюк, работает только если ваши файлы имеют расширения (с точкой):
mv *.* subdir/ mv .* subdir/
Просто запустите эту команду 🙂
mv **/*.* .