2

У меня есть несколько файлов JPEG с абсолютно одинаковыми именами (например, «orig.jpg»), каждый из которых находится в отдельном подкаталоге. Каждый подкаталог имеет уникальное имя (например, xplmz3nc5n, tyrn5m6ktv и т.д.).

Я хочу переименовать JPEG в зависимости от даты и времени их создания (например, 20120629_142536.jpg и т.д.).

Мне удалось использовать Photoshop для пакетного переименования каждого файла с уникальным идентификатором. Ключевой особенностью, которая позволила это, была способность Photoshop "включать все подкаталоги" в пакетный процесс. Я надеялся, что смогу затем использовать exiftool для переименования файлов, чтобы включить дату создания (для легкой каталогизации). К сожалению, процесс пакетного переименования в фотошопе переписывает дату создания файла на сегодняшнюю дату ...

Любые предложения о способе пакетного переименования файлов в серии подкаталогов с помощью, скажем, терминальных команд?

РЕДАКТИРОВАТЬ

Ответ тут и получил следующий результат в Терминале

cd ~/foo
for dir in *; do 
    t=`stat -c %y "$dir" | awk '{print $1"-"$2}' | 
       cut -d ":" -f 1,2 | sed 's/://'`
    mv "$dir" "$t"_"$dir";
done

и получил

stat: недопустимый параметр - c использование: stat [-FlLnqrsx] [-f формат] [-t timefmt] [файл ...] stat: недопустимый параметр - c использование: stat [-FlLnqrsx] [-f формат] [-t timefmt] [файл ...] stat: недопустимый параметр - c использование: stat [-FlLnqrsx] [-f формат] [-t timefmt] [файл ...]

(т.е. я пробовал два разных метода ...).

2 ответа2

2

Одна из возможностей использования даты создания EXIF будет (не проверена, но должна работать):

  • переместите все ваши файлы в один и тот же каталог, переименовав их в уникальное имя (например, имя содержащего каталога плюс суффикс .jpg)

    cd ~/foo
    for i in */; do
      # moves the file (supposedly named orig.jpg) in current directory
      # renaming it to the name of the containing sub directory
      mv ${i}orig.jpg ./`basename $i`.jpg
      # removes the subdirectory, assuming it is now empty
      rmdir $i;
    done
    

    Если файлы не всегда имеют одинаковые имена, но в подкаталоге есть только один файл (имя которого заканчивается на .jpg), вы, конечно, можете заменить команду mv на:

      mv ${i}*.jpg ./`basename $i`.jpg
    
  • затем переименуйте их, используя exiftool:

    exiftool -d %Y%m%d_%H%M%S.jpg "-filename<CreateDate" ~/foo
    

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

    exiftool -d %Y%m%d_%H%M%S%-c.jpg "-filename<CreateDate" ~/foo
    

Больше информации о функции переименования exiftool здесь: http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

1

К сожалению, OSX не имеет инструментов GNU, но вместо этого его основные утилиты являются форками версий BSD. Это означает, что многие ответы командной строки, которые вы найдете для Linux, не будут применяться. Либо потому, что соответствующие опции отсутствуют, либо потому, что они разные.

У меня нет компьютера с OSX для тестирования, но на основе man-страниц OSX для stat и date, это должно сделать то, что вам нужно:

find . -name orig.jpg | 
    while read file; do
     echo mv "$file" "$(date -jf "$(stat -f '%m' "$file")" +%Y%m%d_%H%M%S)".jpg
    done

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

find . -name orig.jpg -print0 | 
    while IFS= read -r -d '' file; do
     echo mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg
    done

Это просто напечатает команды, которые будут выполняться. Если они верны, удалите echo и запустите его снова, чтобы фактически переименовать файлы. Как я уже сказал, я не могу это проверить, поскольку у меня нет доступа к машине с OSX, поэтому вам, возможно, придется настроить ее. Посмотрите справочные страницы, на которые я ссылаюсь (или запустите man stat на вашем компьютере). Я не уверен, что date OSX может иметь отношение к выводу stat -f '%m' , если нет, дайте мне знать, и я постараюсь помочь.

объяснение

  • find . -name orig.jpg : рекурсивно найти все файлы с именем origin.jpg в текущей папке.
  • while read file; ... ; do : это сохранит каждое из имен файлов, найденных командой find как $file а затем выполнит следующие команды для каждого из них.
  • stat -f '%m' $file : здесь должно отображаться время модификации файла в удобочитаемом формате.
  • $(date -jf "DATE" +%Y%m%d_%H%M%S) : вывести дату, заданную DATE как YYMMDD_HHMMSS. Так как мы даем ему вывод stat -f '%m' $file , он напечатает дату, когда файл был изменен.
  • mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg : переименовать $file до возвращаемой даты по date и .jpg .

Эквивалентная команда в Linux:

find . -name orig.jpg | 
    while read file; do 
        echo mv "$file" "$(date -d "$(stat -c '%y' $file)" +%Y%m%d_%H%M%S)".jpg
   done

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