bash - 提取文件名以命名其他文件时出错

标签 bash file-handling

我正在尝试使用 FFmpeg 将视频转换为 Bash 中的图像。我想使用视频的文件名来命名相应的图像(后跟一个整数)。

如果我在同一目录中导出文件,我能够做到这一点:

for file in `find . -name "*.mp4"`; do ffmpeg -i $file -q 1 $file'_'%d.jpeg; done

但是,如果我要将图像导出到所需的目录,则会出现错误。看起来 $file 的值不仅仅是文件名,而是一个目录。

我在尝试什么:

for file in `find . -name "*.mp4"`; do ffmpeg -i $file -q 1 ~/testfolder/$file'_'%d.jpeg; done

我的问题是:我怎样才能正确提取要在此处使用的文件名?

最佳答案

这样做,因为它可以处理包含任何特殊字符(包括换行符,很少使用但在文件名中有效)的文件。

destdir=~/testfolder/
while read -u 5 -r -d '' file
do
  name=$(basename "$file")
  ffmpeg -i "$file" -q 1 "$destdir/${file}_%d.jpeg" </dev/null
done 5< <(find . -name "*.mp4" -print0)

basename 命令是一个外部程序。您可以仅使用 shell 扩展通过以下行获得相同的结果:

name=${file%/}
name=${name##*/}

关于bash - 提取文件名以命名其他文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462690/

相关文章:

c# - 在不打开文件的情况下删除文件的最后 4 个字节?

linux - Bash 排序忽略前 5 行

linux - WHILE循环不循环

linux - 在鹦鹉螺中隐藏已安装的设备

c - fscanf 无法从 txt 文件读取数据

c++ - `fout.write( reinterpret_cast<const char*>(&e), sizeof(e) );` 为什么在这里转换成 `const char*` ?

c++ - LPCTSTR 到 LPCSTR 转换

linux - Bash/echo 和模式

linux - 递归查找所有不以注释开头的php文件

c - 如何使文件指针指向文件的开头?