繁体   English   中英

从bash文件运行find命令

[英]Run find command from a bash file

大家好:我正在制作一个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"

要使变量$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 ] [ $? == 0 ]在bash中工作,但[ $? = 0 ] [ $? = 0 ]也可以工作,更便携。

  3. 命令替换可以用反引号完成,而一些旧shell只接受反引号。 但是,对于现代shell, $(...)具有提高可读性的优点(某些字体无法清楚地区分回引号和正常引号)。 $(...)也可以以清晰明智的方式嵌套。

我更喜欢使用while循环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输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM