Переместите все файлы с определенным расширением от нескольких подкаталогов в один каталог

Солярис используется в корпоративной среде для высокой загрузки, высоких серверов времени работы - который должен быть хорошей рекомендацией сам по себе.

Если Вы хотите войти в некоторые более тайные аппаратные средства затем, можно найти более высокое OSs производительности, но от вопроса я предполагаю, что Вы хотите остаться с Intel.

47
30.03.2016, 20:20
7 ответов

Перейдите к каталогу верхнего уровня дерева, содержащего zip-файлы (cd …), затем выполненный

mv **/*.zip /path/to/single/target/directory

Это работает из поля в zsh. Если Ваша оболочка будет ударом, то необходимо будет работать shopt -s globstar сначала (Вы можете и должны вставить эту команду Ваш ~/.bashrc). Если Ваша оболочка будет ksh, то необходимо будет работать set -o globstar сначала (вставляет его Ваш ~/.kshrc).

С другой стороны, используйте find, который работает везде без специальной подготовки, но более сложен:

find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;

Если Вы хотите удалить пустые каталоги впоследствии в zsh:

rmdir **/*(/^Fod)

В ударе или ksh:

rmdir **/*/

и повторитесь, пока существуют пустые каталоги для удаления. С другой стороны, в любой оболочке

find . -depth -type d -empty -exec rmdir {} \;
63
27.01.2020, 19:34
  • 1
    Сначала find команда выше обработанного в ударе, но должен был измениться на find . -name и т.д. заставить это работать. –  JeffThompson 29.05.2017, 22:08
  • 2
    @Jeff . неявно для GNU, находят, но не для других, я добавил его явно. –  Gilles 'SO- stop being evil' 29.05.2017, 23:31

Если Вы только хотите переместиться .zip файлы, Вы могли сделать что-то как

mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;
15
27.01.2020, 19:34

При использовании версии 4 удара или выше или zsh, можно также использовать рекурсивный globbing:

mv **/*.zip /path/to/move/zip/files/to

Это переместит ТОЛЬКО файлы и не их относительные пути, таким образом, коллизии могли бы произойти.

3
27.01.2020, 19:34
  • 1
    , что Вы подразумеваете под относительными путями? –  Kunok 03.01.2018, 13:44

Как взлом удара, Вы могли использовать питание tar:

(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/

Это имеет преимущество, что оно не зависит от расширений файла, так как оно использует file команда для выбора файлов для перемещения и это сохраняет структуру каталогов, но это не работает с путями, содержащими пробелы.

Финал rm должен туда только удалить исходные файлы (becouse @InquilineKea tolds, о котором он не заботится об исходной папке в комментарии).

Конечно, это особенно подходит, если источник / и цель / папки находится на различных дисках. Иначе другие предложенные решения более эффективны (даже если они полагаются на соглашения о присвоении имен, вместо fileсодержание).

0
27.01.2020, 19:34

Предполагая, что у вас есть GNU-версии find и mv, следующие действия будут более эффективными, чем существующие ответы на основе find:

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

Использование + в конце find -exec означает, что команде mv будет передан список файлов, а не выполнение одной команды mv на каждый найденный файл. Однако ограничение заключается в том, что вы можете поместить '{}' только в конце команды, что требует использования опции mv --target-directory, а насколько я знаю, это GNU-изм.

0
27.01.2020, 19:34

Этот безопасен при перемещении данных и безошибочен, что поддерживается большинством дистрибутивов независимо от версии. Эта команда просканирует подкаталоги, а затем переместит или скопирует в новый каталог назначения.

find. -name *.flac -exec mv '{}' "./flac/" ";"
  • Запустите эту команду в главном каталоге, содержащем подкаталоги -с файлами, которые вы хотите переместить.
  • Где вы можете изменить *.flacна что-то вроде *.zipв вашем случае. Или *.docработает любое расширение.
  • и mv— это команда для перемещения файлов, или вы можете использовать cpдля копирования данных вместо перемещения.
  • ./flac/— это каталог назначения, в который я хочу переместить все файлы FLAC. Вы также можете указать полный путь, например/home/myid/flac/

Полный пример. (в этом случае есть много подкаталогов с именем музыкального исполнителя в /home/myid/Music/, а затем файлы FLAC находятся на разных уровнях подкаталогов. Поскольку мне не нужны папки исполнителей, но я хочу, чтобы все файлы FLAC находились в одном каталоге по адресу/home/myid/Music/flac/

cd /home/myid/Music
mkdir flac
find. -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls

Затем отобразятся все файлы FLAC.

4
27.01.2020, 19:34

В дополнение к совету Жиля, где он предложил

mv **/*.zip /path/to/single/target/directory/

вы можете получить ответ

mv: will not overwrite just-created

, поскольку в целевой каталог могут копироваться повторяющиеся имена файлов.

Если вы добавите --backup=numbered, это создаст пронумерованные файлы резервных копий с повторяющимися именами.

напр.duplicate-name.zip.~1~

0
22.05.2020, 11:14

Теги

Похожие вопросы