#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
aftergrep -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» (в правильные двойные кавычки 😉