代码之家  ›  专栏  ›  技术社区  ›  Lukasz Tracewski

无序查找可用于空白的结果

  •  1
  • Lukasz Tracewski  · 技术社区  · 4 年前

    我正在以WAV格式搜索所有文件,并从中创建一个输出文件,如下所示:

    #!/usr/bin/env bash
    
    AUDIO_PATH="$1"
    OUTPUT_FILE="$2"
    SEED="$3"
    
    get_fixed_random()
    {
      openssl enc -aes-256-ctr -pass pass:$SEED -nosalt </dev/zero 2>/dev/null
    }
    
    AUDIO_FILES=$(find -L $AUDIO_PATH -name '*.wav' | shuf --random-source=<(get_fixed_random))
    
    # This writes all WAV to a single output file
    for file in $AUDIO_FILES; do
        [ ! -e "$file" ] || ffmpeg -i "$file" -f s16le -ac 1 -ar 48000 -
    done > $OUTPUT_FILE
    

    问题是,如果文件中包含空格,这就不起作用了,原因已经讨论过了。 here . 我试着运用这种方法,即

    while IFS= read -r -d '' file; do
    

    1 回复  |  直到 4 年前
        1
  •  1
  •   KamilCuk    4 年前

    不要使用 for file in $something . 阅读 https://mywiki.wooledge.org/BashFAQ/001

    检查脚本 https://shellcheck.net

    要处理空白,请使用零分隔流。

    在shell中,尝试编写一个长管道。沿着:

    find -L "$AUDIO_PATH" ... -print0 |
    shuf -z ... |
    xargs -0 -I{} ffmpeg -i {} ... - > "$OUTPUTFILE"
    

    更喜欢在脚本中使用小写变量。

    -z -0 -print0 GNU工具支持等选项。

    你能做到的 xargs -P<NUM> 使执行并行化,但会影响输出。你可以探索GNU parallel