[英]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.