Я запускаю быстрый скрипт 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 .....