У меня есть несколько файлов .zip в нескольких каталогах:
Fol1/Fol2
Fol3
Fol4/Fol5
Как бы я переместить их все в общую базовую папку?
command-line
files
find
recursive
InquilineKea
источник
источник
Ответы:
Перейдите в каталог верхнего уровня дерева, содержащего zip-файлы (
cd …
), затем запуститеЭто работает из коробки в Zsh. Если ваша оболочка - bash, вам нужно
shopt -s globstar
сначала запустить ее (вы можете и должны добавить эту команду в свой~/.bashrc
). Если ваша оболочка - ksh, вам нужноset -o globstar
сначала запустить ее (поместите в свою~/.kshrc
).В качестве альтернативы используйте
find
, который работает везде без специальной подготовки, но более сложен:Если вы хотите удалить пустые каталоги впоследствии, в zsh:
В bash или ksh:
и повторять до тех пор, пока есть пустые каталоги для удаления. Как вариант, в любой оболочке
источник
find
команда, приведенная выше, работала в bash, но для ее работы пришлось изменить ее наfind . -name
etc..
неявно для поиска GNU, но не для других, я добавил это явно.Если вы хотите переместить только
.zip
файлы, вы можете сделать что-то вродеисточник
Если вы используете bash версии 4 или выше или zsh, вы также можете использовать рекурсивное сглаживание:
Это приведет к перемещению ТОЛЬКО файлов, а не их относительных путей, поэтому могут возникнуть конфликты.
источник
Это безопасно при перемещении данных и без ошибок, которые поддерживаются больше всего независимо от версий. Эта команда будет сканировать подкаталоги, а затем перемещать или копировать в новый каталог назначения.
*.flac
на что-нибудь, как*.zip
в вашем случае. Или*.doc
просто любое расширение работает.mv
это команда для перемещения файлов, или вы можете использоватьcp
для копирования данных вместо перемещения../flac/
каталог назначения, в который я хочу переместить все файлы FLAC. Вы также можете дать ему полный путь, как/home/myid/flac/
Полный пример. (в этом случае есть много подкаталогов с именем музыкального исполнителя на,
/home/myid/Music/
а затем файлы FLAC находятся на разных уровнях подкаталогов. Поскольку мне не нужны папки исполнителя, но я хочу, чтобы все файлы FLAC были в одном каталоге на/home/myid/Music/flac/
Затем отобразятся все файлы FLAC.
источник
;
?Как взломщик bash, вы можете использовать силу
tar
:Преимущество этого заключается в том, что он не зависит от расширений файлов, поскольку использует
file
команду для выбора файлов для перемещения и сохраняет структуру каталогов, но не работает с путями, содержащими пробелы.Финал
rm
- просто удалить исходные файлы (потому что @InquilineKea говорит, что ему нет дела до оригинальной папки в комментарии).Конечно, это особенно подходит, если папки origin и target находятся на разных дисках. В противном случае другие предложенные решения являются более эффективными (даже если они основаны на соглашениях об именах, а не на
file
контенте).источник
Предполагая, что у вас есть GNU-версии find и mv, следующее будет более эффективным, чем существующие ответы на основе find:
Использование
+
в конце find -exec означает, что список файлов будет передан команде mv, вместо того, чтобы выполнять одну команду mv на каждый найденный файл. Однако ограничением этого является то, что вы можете поместить только «{}» в конце команды, что требует использования опции mv --target-directory, и, насколько я знаю, это GNU-изм.источник