Вопрос: Командная строка cp или rsync для обхода диска, ищущего только определенные типы файлов и помещающего их где-нибудь?


Возможно ли использовать только командную строку, чтобы использовать что-то вроде cp или rsync команду для сканирования жесткого диска, ищущего только изображения / видеофайлы? И, может быть, в процессе копирования их в другое место, сохраняя имена / пути в новом месте?

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


2
2017-08-13 20:45


Источник




Ответы:


Вы можете использовать find искать файлы, которые вас интересуют, то есть:

find /mnt/hd1 -name \*.jpg

будет искать файлы jpg (ну, для файлов с расширением .jpg) в каталоге / mnt / hd1. Если вы хотите просто скопировать эти файлы где-нибудь, вы можете:

find /mnt/hd1 -name \*.jpg -exec cp {} /mnt/dest

Это будет выполняться cp для каждого файла, который он может найти в каталоге / mnt / dest.

Надеюсь, поможет :)


4
2017-08-13 21:16



По крайней мере, в моей системе мне нужно закрыть \; после целевого каталога. В системах GNU (которых OP нет, поэтому это только для справки), вы можете сэкономить некоторые накладные расходы, выполнив … -exec cp -t /mnt/dest {} +, Это копирует несколько файлов за один раз. - MvG


Другая возможность, если вы не хотите автоматизировать ее в один скрипт, заключается в использовании вашей команды find для создания сценария bash. Затем запустите скрипт bash. Таким образом, вы также можете указать источник файла.

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

Также вы хотите сохранить путь к каталогу?

т. е. если файл находится здесь

/source/a/b/c/d/e.jpg

Вы хотите скопировать его в

/dest/a/b/c/d/e.jpg?

или

/dest/e.jpg?

Таким образом, пример может быть

find /source -type f -name "*.jpg" -print | awk '{"cp -p "$1" /backup/}' > copy.sh

Это скопирует только один каталог / резервное копирование

Чтобы сохранить, вы могли бы сделать

(cd /source; find . -type f -name "*.jpg" -print | awk '{"cp -p "$1" /backup/"$1}') > copy.sh

Но тогда вы хотите сначала создать все каталоги

(cd /source; find . -type d -print | awk '{print "mkdir -p /backup/"$1}' > mkdir.sh

Сила этого заключается в том, что вы также можете наблюдать за сценариями и следить за тем, чтобы все выглядело хорошо, прежде чем фактически запускать команды. Я сгорел довольно много раз, выполняя команду с ... erm ... неожиданными результатами :)

Кроме того, сценарий также дает вам отчет о том, что вы будете делать.


2
2017-08-13 22:11