簡體   English   中英

路徑名中的空格給Bash中的Find帶來麻煩。 任何*簡單*解決方案?

[英]Spaces in path names giving trouble with Find in Bash. Any *simple* work-around?

有沒有辦法更改以下字符串,所以當存在空格的文件/文件夾時,我不會遇到任何問題?

files=`find ~/$folder -name "*@*" -type f`

我更喜歡是否有一個解決方案,不必涉及必須更改我的代碼的其他部分,但這一行代碼,因為一切似乎工作正常,除了這個小細節。

謝謝

編輯:這是更詳細的代碼:

abc=( $(find "$pasta" -name "$ficheiro_original@*" -type f) )
abc_length=${#abc[@]}

如果您稍后在腳本中沒有使用這些文件名,只需迭代它們並即時處理。

find ~/$folder -name "*@*" -type f | while read -r FILE
do
  echo "do you stuff"
done

否則,你可以設置IFS

IFS=$'\n'
files=$(find ~/$folder -name "*@*" -type f)

更新:

$ IFS=$'\n'
$ a=($(find . -type f ))
$ echo ${#a[@]}
14

如果您需要名稱中可能包含空格的文件列表,則幾乎必須將它們存儲為數組,而不僅僅是字符串。 使用以下內容創建數組:

saveIFS="$IFS"; IFS=$'\n'; files=( $(find ~/"$folder" -name "*@*" -type f) ); IFS="$saveIFS"

然后你將不得不修改腳本的其余部分以將文件用作數組而不是字符串,並且它(和其他文件名)應始終使用雙引號以防止空格被誤認為是分隔符。 例如,您當前正在使用$files任何地方,請將其替換為"${files[@]}"

ls "${files[@]}"
for f in "${files[@]}"; do
    ls "$f"
done
echo "found ${#files[@]} files" 

您必須進行一些更改,但要處理任意名稱,請考慮使用GNU Find選項-print0等。

 find ~/$folder -name "*@*" -type f -print0 | while read -d '^@' file do echo "<<$file>>" done 

(表示為' ^@ '的單字節實際上是ASCII NUL('\\ 0';用Control-V Control-Shift- @輸入 )。

find ~/$folder -name "*@*" -type f -print0 |
while read -d '' file
do
    echo "<<$file>>"
done

分隔符的空字符串表示'使用零字節,ASCII NUL作為分隔符',適用於解析' find ... -print0 '輸出。 (感謝Dennis Williamson的提示。)

這允許您讀取任意名稱。 您應該使用bash數組來保存名稱,但這意味着腳本中的某些更改。

(鑒於只有空格必須擔心的注釋響應,這可能是過度的,盡管使用read來處理具有名稱的行是操作的關鍵部分,並且使用數組可能會使生活更簡單。)

這是另一種不改變其余代碼的方法:

# files=($(find))
eval "files=($(find -printf '"%h/%f" '))"

for f in "${files[@]}"; do
  echo "$f"
done

它很臟,對於帶有特殊字符的文件名不起作用,例如" 。它使用eval來評估Bash數組的字符串和-printffind來形成該字符串。

我個人更喜歡改變$IFS ,僅限FYI。

要將包含空格的文件名讀入Bash數組變量,您還可以使用“read”內置命令:

printf '%q\n' "$IFS"

IFS=$'\n' read -r -d "" -a abc <<< "$(find ~/$folder -name "*@*" -type f)"
IFS=$'\n' read -r -d "" -a abc < <(find ~/$folder -name "*@*" -type f)  # alternative

abc_length=${#abc[@]}

for ((i=1; i <= ${#abc[@]}; i++)); do echo "$i:  ${abc[i-1]}"; done

printf '%q\n' "$IFS"

請注意,新設置的IFS變量的范圍僅限於執行read命令(使原始IFS變量保持原樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM