从bash文件中运行查找命令

3

大家好:我正在编写一个xfe脚本,以给定的目录作为源文件,使用zenity获取输出目录并执行一些操作,例如:

#!/bin/bash

OUTPUT_DIR=`zenity --file-selection --directory --filename="$1"`

if [ $? == 0 ]; then
    find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi

当脚本被调用时,oggenc未被执行...有什么想法吗?
解决方案:根据下面的答案,这将按预期工作:
#!/usr/bin/sh

OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1")

if [ $? = 0 ]; then
    export OUTPUT_DIR
    find "$1" -maxdepth 1 -type f -name "*.wav" -exec sh -c 'oggenc -Q "$0" -q 3 -o "${OUTPUT_DIR}/$(basename "${0/.wav/.ogg}")"' {} \;
fi
zenity --info --text="Done"
2个回答

1

我更喜欢使用 while 循环而不是管道。你的代码可以按照这种方式重写

while IFS= read -r -d '' file; do 
   oggenc -Q "${file}" -q 3 "${OUTPUT_DIR}/$(basename ${file/.wav/.ogg})"
done < <(find . -maxdepth 1 -type f -name "*.wav" -print0)

你的代码没有运行的原因是单引号 ' 禁止变量扩展,所以 $OUTPUT_DIR 将不会扩展。 编辑 -print0IFS= 结合使用是为了仅在 \0 上拆分 find 输出,而不是在文件名上拆分空格。

在你的代码中,我需要在使用 OUTPUT_DIR 之前将其导出吗? - Joel
@Joel 不会的。在双引号中它会正常扩展。 - vsminkov
@John1024 感谢您指出。我使用了错误的IFS进行测试。我会修复它。 - vsminkov
好的,使用您更新的代码 @vsminkov,${OUTPUT_DIR}/${file/.wav/.ogg} 变成了这样:**/home/XXX/Música/test/out//home/XXX/Música/test/in/ringout.ogg**。 - Joel
@Joel 好的,我明白了。你只需要使用 basename。我会更新我的答案。 - vsminkov
啊,好的,但似乎对带空格的文件名有些问题。 - Joel

1
为了让变量$OUTPUT_DIR在子进程中可用,添加一行代码:
OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1")
if [ $? = 0 ]; then
    export OUTPUT_DIR
    find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi

或者,稍微简单一点:

if OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1"); then
    export OUTPUT_DIR
    find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi

注意:

  1. 命令'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"'用单引号括起来。这意味着变量不会被父shell扩展,而是由子shell扩展。要使其对子shell可用,必须导出变量。

  2. [ $? == 0 ]在bash中有效,但[ $? = 0 ]也可以使用,并且更具可移植性。

  3. 命令替换可以使用反引号进行,一些旧的shell只接受反引号。然而,对于现代shell,$(...)具有改进的可读性(某些字体不能清楚地区分反引号和普通引号)。此外,$(...)可以以明确和合理的方式嵌套。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接