2014-10-28 2 views
0

У меня есть папка, содержащая вложенные папки. В этих подпапках находятся файлы .jpg и .mov.Как скопировать файлы по типу файла

Что я хочу сделать, это дублировать дерево в другую корневую папку, но включать только файлы .mov.

Есть ли команда терминала, которую я могу выдать, которая будет делать это как магия? Я надеюсь, что там может быть гуру linux с навыками ниндзя, которые могут сэкономить мне много времени.

Пример:

ток:

Pictures 
-- 2014 
----- January 
--------- file1.jpg 
--------- file1.mov 
----- February 
--------- file1.jpg 
--------- file1.mov 
----- March 
--------- file1.jpg 
--------- file2.jpg 
----- April 
--------- file1.mov 
--------- file2.mov 



Desired: 
Pictures 
-- 2014 
----- January 
--------- file1.jpg 
----- February 
--------- file1.jpg 
----- March 
--------- file1.jpg 
--------- file2.jpg 



Movies 
-- 2014 
----- January 
--------- file1.mov 
----- February 
--------- file1.mov 
----- April 
--------- file1.mov 
--------- file2.mov 
+0

Ответ будет немного отличаться от Linux от OS X. –

+0

Это что-то, что вам нужно сделать только один раз, или вам нужно будет повторить это действие, отсортировать новые изображения и фильмы в соответствующие каталоги? – Omnipresence

+0

Просто нужно сделать это один раз. Я понял, что моя коллекция фотографий огромна, главным образом из-за видео, поэтому моя идея состоит в том, чтобы создать параллельную папку, которая соответствует древовидной структуре, и содержит только видео. Затем в будущем я могу сортировать их вручную, когда они входят. – Kenny

ответ

1

I будет использовать find с dirname. Должен работать одинаково как в Linux, так и в MacOS. Это сценарий оболочки, который должен работать в bash.

Примечание:, чтобы убедиться, что вы не запустить его в неправильном месте или с неправильными значениями $source и $target я приставкой всех необходимых команд с echo так, что он будет печати команды, а не выполнить это. Убедитесь, что он делает то, что вы ожидаете, затем удалите все echo (например, замените echo mkdir ... только mkdir ...). Это общая мера предосторожности при написании сложных сценариев оболочки.

source="/path/to/source" 
target="/path/to/target" 
cd "$source" 
find . -type f -name '*.mov' | 
    while read fn ; do 
     path=`dirname $fn` 
     echo mkdir -p "$target/$path" # -p is essential here 
     echo cp "$fn" "$target/$path/" 
    done 

Здесь мы итерацию по списку *.mov файлов в каталоге $source, и для каждого файла, мы извлекаем имя каталога с помощью dirname. Затем мы создаем соответствующий подкаталог в $target с использованием mkdir -p (который создаст все необходимые подкаталоги и не сработает, если каталог уже существует) и, наконец, скопируйте файл.

+0

Спасибо. Похоже на хорошее решение. – Kenny

1

Я предложил бы использовать rsync, я надеюсь, что синтаксис тот же на OS X

rsync -vrR --include="*.jpg" --include="*/" --exclude="*" /path/to/source /path/to/target 

Вам нужно будет выполнить две отдельные команды для * .mov и * .jpg, так как целевые диски разные

+0

Nice однострочное решение.Хотя я не пробовал, потому что вместо этого я использовал GUI-инструмент. :) – Kenny

0

В случае, если это поможет кому-то, я на самом деле нашел более простое решение, которое не требует командной строки. Я использовал FreeFileSync для копирования файлов в новое дерево, затем вернулся и использовал finder для удаления файлов, которые были скопированы. Еще двухэтапный процесс, но это было просто, поскольку он не использовал командную строку.

FreeFileSync имеет фильтрацию, поэтому мне удалось выделить только видео для копирования.

Удаление видеороликов из папки изображений было таким же простым, как поиск возможностей поиска и фильтрация только по типам видеофайлов. Затем один из них убил их всех сразу.

Смежные вопросы