Способ перемещения файлов в bash и автоматического переименования скопированного файла без перезаписи существующего файла - PullRequest
2 голосов
/ 28 декабря 2011

Я делаю серьезную реструктуризацию большого количества каталогов с тоннами jpgs, некоторые из которых имеют то же имя, что и файлы в других каталогах.Я хочу переместить / скопировать файлы в альтернативные каталоги и заставить bash автоматически переименовывать их, если имя соответствует другому файлу в этом каталоге (переименовывая IMG_238.jpg в IMG_238_COPY1.jpg, IMG_238_COPY2.jpg и т. Д.), Вместо перезаписи существующего файла.1004 *

Я установил скрипт, который принимает jpegs и перемещает их в новый каталог на основе данных exif.Последняя строка скрипта, которая перемещает один jpg: mv -n "$JPEGFILE" "$DIRNAME"

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

(В случае, если это имеет значение, я использую bash 3.2 в Mac OSX Lion).

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Это должно сделать это

# strip path, if any
fname="${JPEGFILE##*/}"
[ -f "$DIRNAME/$fname" ] && {
    n=1
    while [ -f "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" ] ; do
        let n+=1
    done
    mv "$JPEGFILE" "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}"
} || mv "$JPEGFILE" "$DIRNAME"

РЕДАКТИРОВАТЬ: Улучшено.

2 голосов
/ 28 декабря 2011

Вы можете попробовать загрузить и посмотреть, работает ли Ubuntu / Debian на основе Perl rename.Имеет функциональность в стиле sed.Обратимся к странице руководства (в моей системе, но сценарий должен быть таким же, как и связанный):

«переименовать» переименовывает имена файлов, предоставленные в соответствии с правилом, указанным в качестве первого аргумента.Аргумент perlexpr - это выражение Perl, которое, как ожидается, изменит строку $ _ в Perl, по крайней мере, для некоторых из указанных имен файлов.Если данное имя файла не изменено выражением, оно не будет переименовано.Если в командной строке не указано ни одного имени файла, оно будет прочитано через стандартный ввод.

Например, чтобы переименовать все файлы, соответствующие "* .bak", чтобы удалить расширение, вы можете сказать

    rename 's/\.bak$//' *.bak

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

    rename 'y/A-Z/a-z/' *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...