Скрипт добавляет расширение дважды

Скрипт добавляет расширение дважды

Я запускаю быстрый скрипт bash, который преобразует любые файлы .mov в .mp4. Это отлично работает в 99% случаев, но иногда я натыкаюсь на малые барабаны и получаю ошибку:

файл /home/jgeoffrey/Documents/HomeMovie/Test/year1video.mov.mov Нет такого файла или каталога

Как вы видите, расширение файла по какой-то причине добавлено дважды в конец файла? Если я перейду в реальный каталог, что не так, оно там только один раз.

Что вызывает это и как это исправить? Ниже приведен скрипт:

#Scanning Documents for any mov files
for f in $(find /home/jgeoffrey/Documents -type f -name "*.mov");
do
 #checking if a .mp4 exists
 mp4=${f%.mov}.mp4  
 #if no .mp4 exist convert the file
 if ! lsof $f && [ ! -e "$mp4" ];
 then
    #Converting the file to .mp4
    avconv -i $f.mov -codec copy $f.mp4
 fi
done

решение1

В вашей findкоманде:

find /home/jgeoffrey/Documents -type f -name "*.mov"

вы находите и перебираете .movфайлы, используя переменную f. Таким образом, значение переменной $fуже содержит .movфайл. Например, предположим, что один из файлов — foo.mov.

Опять же, если avconfвы использовали входной файл как $f.mov, то имя файла становится

foo.mov.mov 

Вот что именно говорится в ошибке:

видео1года.mov.mov: Данный файл или каталог отсутствует

Итак, вам нужно:

avconv -i "$f" -codec copy "$mp4"

as $mp4уже содержит имя файла с .movудаленными и .mp4добавленными данными.

Также заключите в кавычки переменную, содержащую имена файлов, в противном случае произойдет сбой в случае имен файлов с пробелами.

Также при цикле по списку файлов, разделенных новой строкой, используйте while, вместо for:

find .... | while IFS= read -r f; do .....

Связанный контент