从bash文件运行find命令

时间:2016-08-10 01:14:50

标签: linux bash find

大家好:我正在创建一个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 个答案:

答案 0 :(得分: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只接受反引号。然而,对于现代贝壳,$(...)具有提高可读性的优点(某些字体不能清楚地区分背面和正常的引号)。 $(...)也可以以清晰明智的方式嵌套。

答案 1 :(得分: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=一起使用,仅在find上分割\0输出,而不在文件名中的空格分割。