循環遍歷資料夾並列出文件

循環遍歷資料夾並列出文件

我有一個名為「sample」的資料夾,其中有 3 個檔案。我想編寫一個 shell 腳本,它將讀取範例資料夾中的這些檔案並使用curl 將其發佈到 HTTP 網站。

我編寫了以下內容來列出資料夾內的文件:

for dir in sample/*; do
        echo $dir;
        done

但它給了我以下輸出:

sample/log

sample/clk

sample/demo

它正在附加其中的父資料夾。我想要的輸出如下(沒有父資料夾名稱)

log

clk

demo

我該怎麼做呢?

答案1

用於basename移除檔案的前導路徑:

for file in sample/*; do
    echo "$(basename "$file")"
done

但為什麼不呢:

( cd sample; ls )

答案2

假設您的 shell 支援它,您可以使用參數擴展

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

或者您可以更改到該目錄並在那裡進行列表

答案3

這取決於您想對目錄執行什麼操作。

要簡單地列印名稱,而不檢查它是否是目錄,您可以使用 ls:

ls -1 sample

更好的是找到,因為你可以使用過濾器:

find sample -type d -maxdepth 1 -printf '%f\n'

如果要對檔案執行命令,應使用 find 而不是 for 迴圈:

find sample -type d -maxdepth 1 -exec basename {} \;

答案4

由於 *nix 系統允許幾乎任何字元作為檔案名稱的一部分(包括空格、換行符、逗號、管道符號等),因此您永遠不應該在 shell 腳本中解析「ls」命令的輸出。這不可靠。看為什麼你不應該解析 ls 的輸出

使用“查找”建立文件列表。如果您使用的是 Bash,則可以將「find」的輸出插入陣列中。下面的範例,但需要注意的是,我使用了不起作用的“curl”命令!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F ‘data=@"$file"’ UPLOAD_ADDRESS
    done
fi

相關內容