Я пытаюсь пакетно переместить / организовать большое количество файлов (.jpg) из вложенных подкаталогов в относительный каталог. Структура заранее спланирована. Просто не на 100% уверен, что это самый эффективный и безопасный способ сделать это.

Пример структуры:

/directory/subdir/jpg/
/directory/subdir/source/something.jpg
/directory/subdir/source/something.tif
/directory/subdir/source/something-else.jpg
/directory/subdir/source/something-else.tif
/directory/subdir/source/another-file.jpg
/directory/subdir/source/another-file.tif
/directory/another-subdir/jpg/
/directory/another-subdir/source/yet-another-file.jpg
/directory/another-subdir/source/yet-another-file.tif

Цель состоит в том, чтобы получить это к этому ...

/directory/subdir/jpg/something.jpg
/directory/subdir/jpg/something-else.jpg
/directory/subdir/jpg/another-file.jpg
/directory/subdir/source/something.tif
/directory/subdir/source/something-else.tif
/directory/subdir/source/another-file.tif
/directory/another-subdir/jpg/yet-another-file.jpg
/directory/another-subdir/source/yet-another-file.tif

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

find /directory -name \*.jpg -exec mv {} ../jpg/ \;

Если есть какая-то форма "пробного запуска", то кто-нибудь может знать о ней, которую я могу использовать для визуального тестирования перед тем, как фактически выполнить, это было бы удивительно. Спасибо!

ОБНОВИТЬ:

На самом деле, я сейчас пытаюсь сделать то же самое локально на моем Mac, и получаю эту ошибку. Какие-нибудь умные обходные пути?

$ find -name "*.jpg" -execdir pwd \; -execdir echo mv -v '{}' ../jpg \;
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

1 ответ1

2

Вы можете выполнить пробный прогон, просто включив echo:

find /directory -name \*.jpg -exec echo mv {} ../jpg/ \;

Но это не будет делать то, что вы хотите, так как ../jpg всегда вычисляется в текущем каталоге, поэтому все изображения jpg будут перемещены в $PWD/../jpg .

Это должно работать как ожидалось:

find /directory -name "*.jpg" -execdir pwd \; -execdir echo mv -v '{}' ../jpg \;

потому что -execdir

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

Но, конечно, как «Мы говорим о десятках гигабайт данных и тысячах файлов, которые имеют решающее значение для организации нашего клиента». всегда иметь под рукой актуальную резервную копию ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .