我目前正在使用一個程式,該程式創建一個帶有時間戳的檔案夾并將一些檔案放入其中。
我想撰寫一個腳本來按字母順序自動從最后一個或倒數第二個檔案夾中檢索檔案。
我如何在 bash 上做到這一點?
圖片供參考。我想從 18-38 檔案夾或 17-45 檔案夾中檢索檔案。

uj5u.com熱心網友回復:
我想撰寫一個腳本來按字母順序自動從最后一個或倒數第二個檔案夾中檢索檔案。
cd path/to/02-March-2022
last_dir=$(printf '%s\n' */ | sort | tail -n 1)
second_last_dir=$(printf '%s\n' */ | sort -r | sed '2!d; 2q')
- 您可以洗掉或添加排序
-r以在第 N 個最新和第 N 個最舊之間切換。
編輯:
- Glob 總是按字母順序排序(根據當前語言環境),所以第一個
sort實際上是多余的。但如果您需要額外的標志,或按特定欄位、后綴等排序,sort則很有用。sort - 和路徑名擴展都
sort受到當前語言環境的影響,因此請考慮設定LC_ALL=C一致的行為。(export LC_ALL=C或LC_ALL=C sort為了sort看到它)。
uj5u.com熱心網友回復:
嘗試
folders=( path/to/02-March-2022/*/ )
last_dir=${folders[-1]%/}
second_last_dir=${folders[-2]%/}
uj5u.com熱心網友回復:
假設您有以下目錄:
% ls -l
total 0
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 1
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 2
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 3
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 4
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 5
隨著'最后'的存在5。
你可以做:
% for fn in *; do [[ -d "$fn" ]] && lf="$fn"; done
% echo "$lf"
5
但是,我不能過分強調,* 可能會或可能不會給您您認為的“最后一個目錄”。
如果您想確保它是最后一個,請將它們排序stat,然后取最后一個。
uj5u.com熱心網友回復:
由于默認情況下通配符是按字母順序排列的,因此我會將所有檔案名加載到一個陣列中并選擇最后一個元素:
all_files=( * )
last_file=${all_files[-1]}
有兩點值得注意:
- 如果目錄條目可能是檔案或子目錄,則必須以
all_files相反的順序回圈并選擇第一個是純檔案的條目。 - 您希望它們按字母順序排序,但是這個術語的含義,即排序順序,取決于您的環境——
LC_COLLATE分別取決于變數LC_ALL。您可能想要設定
IE:
export LC_ALL=C
在創建陣列之前。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/437420.html
