ryg

Копирование файлов по списку.

Пакетное копирование файлов в Mac OS X

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

Копировать по списку файлов

Если у вас имеется список файлов, то можно использовать AppleScript.

set filePaths to paragraphs of (read (choose file with prompt "Выбрать список файлов") as «class utf8»)
set fileFolder to POSIX path of (choose folder with prompt "Где искать файлы")
set newFolder to (choose folder with prompt "Куда переносить файлы")


set foundFiles to {}
repeat with fileName in filePaths
	
	set fileName to (contents of fileName)
	set xxx to do shell script "find " & quoted form of fileFolder & " -name " & quoted form of fileName
	if xxx ≠ "" then
		
		set a to POSIX file xxx
		tell application "Finder"
			move file a to newFolder
		end tell
		set end of foundFiles to fileName & return
	end if
end repeat

Данный скрипт берет список имен файлов из заданного текстового файла и ищет их в указанном каталоге и его подкаталогах и перемещает их в заданную папку. Имена файлов должны быть написаны по одному в строке. Чтобы скрипт не перемещал, а только копировал найденные файлы, необходимо изменить строку

move file a to newFolder

на:

copy file a to newFolder

Замечание: в папке поиска не должно быть библиотек apperture и iPhoto, так как в данном случае при попытке копирования возникает ошибка, и скрипт аварийно завершается.

Если поиск не нужно производить по дереву каталогов, то можно использовать более простой вариант со скриптом в bash:

#!/bin/bash
target="~/folder1"
destination="~/folder2"
fnames=$(cat ~/list.txt)
for i in $fnames; do
cp ${target}/${i} ${destination}/
echo "copying $i"
done
echo "done"

Данный скрипт копирует файлы из списка, указанного в файле ~/list.txt из папки ~/folder1 в папку ~/folder2.

Список файлов в конкретном каталоге можно получить командой, перейдя в терминале в нужную вам папку и набрав команду ls

ls -1 >~/list.txt

И потом отредактировать данный список в текстовом редакторе.

Скопировать только структуру папок.

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

$ rsync -a /path/from/ /path/to/ --include \*/ --exclude \*

где /path/from - папка откуда начинается копирование, а /path/to/ - куда произвести копирование.

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

find . -name '*.jpg' -exec mv {} /new/dir/ \;

Данная команда использует две команды find для поиска нужных файлов и mv - перенести файлы (ее можно заменить на cp - скопировать файлы). В данном контексте поиск произведен будет нчиная с текущего каталога где будет выполнена команда, чтобы указать конкретный каталог в котором будет производиться поиск, его необходимо указать (/sourcedir/):

find ~/sourcedir/ -name '*.jpg' -exec mv {} /new/dir/ \;

Вместо *.jpg можно указать другое имя или тип файла или регулярное выражение.