代码之家  ›  专栏  ›  技术社区  ›  user3313834

在文件名中使用空格读取时

  •  1
  • user3313834  · 技术社区  · 6 年前

    关于这个 .ogg 文件

    $ tree
    .
    ├── Disc 1 - 01 - Procrastination.ogg
    ├── Disc 1 - 02 - À carreaux !.ogg
    ├── Disc 1 - 03 - Météo marine.ogg
    └── mp3
    

    我试着用 while 循环到ffmpeg将它们转换为mp3在文件名中保留空格::

    $ ls *.ogg | while read line; do ffmpeg -i "$line" mp3/"$line".mp3 ; done
    

    但我得到了这个错误::

    $ ls *.ogg | while read line; do ffmpeg -i "$line" mp3/"$line".mp3 ; done
    ...
    Parse error, at least 3 arguments were expected, only 0 given
    in string ' 1 - 02 - À carreaux !.ogg' ...
    ...
    

    本报告 bash ffmpeg find and spaces in filenames 即使它看起来很相似,但对于更复杂的脚本来说,它也没有答案。

    ffmpeg not working with filenames that have whitespace 仅当输出为http://URL时修复它

    2 回复  |  直到 6 年前
        1
  •  6
  •   codeforester    6 年前

    使用 find -print0 获取NUL分隔的文件列表,而不是解析 ls 输出永远不是一个好主意:

    #!/bin/bash
    
    while read -d '' -r file; do
      ffmpeg -i "$file" mp3/"$file".mp3 </dev/null
    done < <(find . -type f -name '*.ogg' -print0)
    

    您也可以使用一个简单的glob来实现这一点:

    shopt -s nullglob # make glob expand to nothing in case there are no matching files
    for file in *.ogg; do
      ffmpeg -i "$file" mp3/"$file".mp3
    done
    

    请参见:

        2
  •  2
  •   chepner    6 年前

    这里不需要循环;允许 find 为您执行命令。

    find . -type f -name '*.ogg' -exec ffmpeg -i {} mp3/{}.mp3 \;
    

    或者,如果你想把 .ogg 结果的扩展:

    find . -type f -name '*.ogg' -exec sh -c 'ffmpeg -i "$1" mp3/"${1%.ogg}.mp3"' _ {} \;
    

    相反,您可以跳过 发现 总共:

    shopt -s extglob
    for f in **/*.ogg; do
      [[ -f $f ]] || continue
      ffmpeg -i  "$f" mp3/"${f%.ogg}.mp3"
    done