Переименование файлов в bash-скрипте с использованием mv

#linux #bash #mv

#linux #bash #mv

Вопрос:

Я восстановил много файлов MOV с неисправного жесткого диска, однако программное обеспечение назвало эти файлы в соответствии с расположением блока:

263505816.mov и т.д…

Я написал небольшой скрипт, который использует приложение mediainfo, чтобы я мог считывать дату и время создания и соответственно переименовывать файлы:

 for f in *.mov
do
    MODIFIED=$(mediainfo -f $f |grep -m 1 "Encoded date" |sort -u |awk -F "UTC " '{print $2}')
    DATECREATED=$(echo $MODIFIED |cut -d' ' -f 1)
    TIMECREATED=$(echo $MODIFIED |cut -d' ' -f 2 |tr -s ':' '-')

    mv $f "$DATECREATED $TIMECREATED.mov"

done
  

Который работает нормально, но когда я изменяю оператор mv, добавляя 2 слова в конце:

 mv $f "$DATECREATED $TIMECREATED Holidays 2011.mov"
  

я получаю следующее:

 mv: target â  Holidays 2011.movâ is not a directory
  

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

Большое спасибо,

Комментарии:

1. Звучит так, будто $f содержит пробелы и интерпретируется как несколько аргументов, и в этом случае решением было бы заключить его в кавычки: "$f"

2. Кроме того, я надеюсь, что у вас есть резервные копии ваших восстановленных файлов, потому что это выглядит как хороший способ потерять их все из-за ошибок в вашем скрипте оболочки.

3. Вы можете потерять sort -u after grep -m1 .

4. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что он принадлежит Unix.SE

Ответ №1:

Я думаю, что это сработало в первый раз, потому что *.mov расширилось только до числовых файлов, подобных тому, что в вашем примере, но после первого выполнения вашего скрипта он переименовал файлы, введя пробелы в форме $DATECREATED $TIMECREATED.mov . По сути, во второй раз mv выполняется попытка переместить $DATECREATED и $TIMECREATED.mov в ваш целевой файл, и поскольку это не каталог, это завершается неудачей.

Вы можете решить эту проблему, заключив ее в кавычки $f . Попробуйте это так:

 mv "$f" "$DATECREATED $TIMECREATED Holidays 2011.mov"
  

На самом деле, рекомендуется всегда заключать переменные в кавычки, если вы не уверены, что они не будут содержать специальных символов.

Ответ №2:

Перед $DATECREATED и после .mov у вас есть некоторые символы, которые выглядят как двойные кавычки, но, по-моему, это не так. Несколько типографских цитат. Попробуйте заменить обычными двойными кавычками " . — в дополнение к предложению также заключить «$ f» (в правильные двойные кавычки 😉