Назад | Перейти на главную страницу

Bash: как скопировать временные метки с помощью касания и регулярного выражения?

Поскольку это скорее вопрос Bash, я думаю, что он лучше подходит для serverfault, чем superuser, хотя я говорю о медиафайлах.

Мне пришлось выполнить пакетное преобразование нескольких файлов мультимедиа, и все выходные файлы имеют новую метку времени.

/somedir/
    file1.mpg     (correct timestamp)
    file1.mpg.m4v (wrong timestamp)
    file2.mpg     (correct timestamp)
    file2.mpg.m4v (wrong timestamp)
    ...

Я хочу сделать пакетную копию меток времени, чтобы каждый * .mpg.m4v получал метку времени соответствующего файла * .mpg.

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

Я на правильном пути, и есть ли у кого-нибудь предложения о том, как мне нужно делать регулярное выражение (мои знания регулярных выражений плохие, плохие, плохие), чтобы справиться с этим?

Посмотрим, как насчет ...

for f in *.mpg; do
   touch -r "$f" "${f}.m4v"
done

Нет необходимости в регулярных выражениях, просто чтобы рассмотреть проблему с правильной стороны. Гораздо проще пройтись по * .mpg и добавить к ним .m4v, чем наоборот, хотя вы также можете написать это другим способом без регулярных выражений (просто для удовольствия):

for f in *.m4v; do
   touch -r "${f%\.m4v}" "$f"
done

Если вы хотите, чтобы это было сделано одной командой, вы можете сделать это с помощью find (ограничивая его одним уровнем для безопасности):

find . -maxdepth 1 -name '*.mpg' -exec touch -r {} {}.m4v \;