[英]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
笔记:
命令'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"'
出现在单引号中。 这意味着父shell不会扩展变量。 它们由子shell扩展。 要使其可用于子shell,必须导出变量。
[ $? == 0 ]
[ $? == 0 ]
在bash中工作,但[ $? = 0 ]
[ $? = 0 ]
也可以工作,更便携。
命令替换可以用反引号完成,而一些旧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
不会扩展。
编辑
-print0
与IFS=
一起使用,是仅在\\0
而不是在文件名中的空格上分割find
输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.