簡體   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