
我有一個名為「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