Изменить дату изменения на имя файла - PullRequest
0 голосов
/ 04 мая 2018

У меня есть несколько файлов, из которых я хочу изменить дату модификации в linux. Дата изменения сохраняется в имени файла.

Итак, у меня есть файлы, чье имя, например, «IMG_20180101_010101.jpg», но дата изменения - сегодня. Я хочу изменить дату модификации на 2018-01-01 01:01:01, как в имени файла. Я пытался найти и коснуться:

find . -iname 'IMG*' -print | while read filename; do touch -t {filename:7:8} "$filename"; done

Когда я делаю это, я всегда получаю сообщение об ошибке («неверный формат даты: {имя файла: 7: 8}).

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Если я правильно понял, вы хотели бы написать имена файлов в вашем собственном формате. Как насчет этого сценария:

#!/bin/bash

suffix=".jpg"

for file in "IMG*"; do # Careful, the loop will break on whitespace
    fileDate=$(echo $file| cut -d'_' -f 2)
    year=${fileDate:0:4}
    month=${fileDate:4:2}
    day=${fileDate:6:2}

    fileHour=$(echo $file| cut -d'_' -f 3 | sed -e s/$suffix//)
    hour=${fileHour:0:2}
    min=${fileHour:2:2}
    secs=${fileHour:4:2}
    newName="$year-$month-$day $hour:$min:$secs$suffix"
    mv $file "$newName"
done
0 голосов
/ 04 мая 2018

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

find -type f -name "IMG_*" -exec bash -c 'touch -t $(sed "s/.*IMG_\([0-9]\{8\}\)_\([0-9]\{4\}\)\([0-9]\{2\}\).jpg$/\1\2.\3/" <<< "$1") "$1"' _ {} \;

Как упоминалось на справочной странице touch, опция -t предполагает формат [[CC]YY]MMDDhhmm[.ss]. Это цель команды sed.

...