這個問題在這里已經有了答案: 在 Bash 中回圈使用空格的目錄 3 個答案 昨天關門。
執行以下 bash 腳本時遇到奇怪的行為:
#! /bash/bin
dirs=$(ls .)
for dir in $dirs ; do
files=$(ls $dir)
for file in $files ; do
line=$(head -n -1 $dir/$file)
echo $line
done
done
我得到的是 ls / 命令的結果,而不是 $line 的回顯,然后是 $line 的回顯,然后是 $files 的內容。我的猜測是我超出了 bash 的一些限制:我有 171 個目錄,每個目錄有 500 個檔案。當我添加該行時:
echo ${#line}
對于腳本,我得到了正確的答案(68);但是 $line 的回聲填滿了我的終端視窗。我現在能做什么?
uj5u.com熱心網友回復:
那么,您想列印除當前級別下一個目錄級別的所有檔案的最后一行之外的所有檔案嗎?正如評論所暗示的,永遠不要決議ls輸出,它是為人類服務的,而不是為自動化服務的。請改用通配符:
for f in */*; do
head -n -1 "$f"
done
但是有兩個潛在的問題:
沒有這樣的檔案。默認情況下,將有一個回圈迭代,變數
f設定為 literal value*/*。nullglob您可以通過在回圈之前啟用該選項并在回圈之后再次禁用它來避免這種情況:shopt -s nullglob for f in */*; do head -n -1 "$f" done shopt -u nullglob一些“檔案”不是真正的檔案(鏈接、目錄……)。但是我們可以在執行之前測驗一下
head:shopt -s nullglob for f in */*; do if [[ -f "$f" ]]; then head -n -1 "$f" fi done shopt -u nullglob
正如@JohnKugelman 所指出的,這比回圈更簡單:
head -n -1 */*
但不幸的是,沒有簡單的方法可以解決上面提到的第二個問題。因此,如果您不能 100% 確定其中的所有檔案*/*都是真正的檔案,那么帶有測驗的回圈會更安全......
...除非您使用專用實用程式,例如find:
find . -mindepth 2 -maxdepth 2 -type f -exec head -n -1 {} \;
該-type f試驗只保留真正的檔案。該-exec操作采用一個引數,該引數是對每個找到的檔案執行的命令,其中{}代表當前檔案的路徑。此命令必須以轉義的分號 ( \;) 結束。
注意:如果您有數千個檔案并且您列印它們的全部內容但最后一行,那么它“填滿您的終端視窗”也就不足為奇了。以防萬一您只想列印這些檔案的第一行,請替換head -n -1為head -n1.
uj5u.com熱心網友回復:
答案可能與檔案和目錄的數量無關,而是與破壞腳本行為的檔案有關。例如,腳本本身是一個不是目錄但將在第一個回圈中列出的檔案。目錄中的任何目錄也會破壞腳本。還要注意第一行中的錯誤應該是
#!/bin/bash
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416892.html
標籤:
