Linux 洗牌查找使用空格的结果
我正在搜索WAV格式的所有文件,并从中创建一个输出文件,如下所示:Linux 洗牌查找使用空格的结果,linux,bash,Linux,Bash,我正在搜索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=$(fi
#!/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
构造,但我无法获得正确的语法。帮助?不要对$something中的文件使用
。阅读
请使用检查脚本
要处理空白,请使用零分隔流
在shell中,尝试编写一个长管道。沿着:
find -L "$AUDIO_PATH" ... -print0 |
shuf -z ... |
xargs -0 -I{} ffmpeg -i {} ... - > "$OUTPUTFILE"
更喜欢在脚本中使用小写变量
GNU工具支持-z
-0
-print0
等选项
您可以使用
xargs-p
来并行执行,但这会影响输出。您可以探索GNUparallel
来并行化执行,并保持顺序输出。要读取零分离流,首先必须有零分离流<代码>[!-e“$file”]| |-双重否定?为什么不[-e…]&&
?查找文件后检查文件是否存在有什么原因吗?find-L$AUDIO\u PATH
如果$AUDIO\u PATH
包含空格,则会中断。请熟悉引用的原则以及它如何影响Bash中的分词:@DanielKamilKozar我知道,这就是问题的重点。引用的帖子对此进行了详细讨论,只是我不知道如何应用正确的解决方案。@KamilCuk这里有cargo cult编程的元素。正如您所指出的,该检查没有多大意义。感谢您提供有关bash编程的额外提示。该方法比原来的方法更干净,工作完美无瑕。
find -L "$AUDIO_PATH" ... -print0 |
shuf -z ... |
xargs -0 -I{} ffmpeg -i {} ... - > "$OUTPUTFILE"