Shell
如何獲取目錄中的最後 N 個文件?
我在目錄中有許多按文件名排序的文件。我希望將最後的 N 個(比如 N=4)文件複製到我的主目錄。我該怎麼做?
cp ./<the final 4 files> ~/
這可以通過 bash/ksh93/zsh 數組輕鬆完成:
a=(*) cp -- "${a[@]: -4}" ~/
這適用於所有非隱藏文件名,即使它們包含空格、製表符、換行符或其他困難字元(假設目前目錄中至少有 4 個非隱藏文件帶有
bash
)。這個怎麼運作
a=(*)
a
這將創建一個包含所有文件名的數組。bash 返回的文件名按字母順序排序。(我假設這就是*“按文件名排序”的意思。*)
${a[@]: -4}
這將返回數組的最後四個元素
a
(前提是數組至少包含 4 個元素bash
)。
cp -- "${a[@]: -4}" ~/
這會將最後四個文件名複製到您的主目錄。
同時複製和重命名
這將僅將最後四個文件複製到主目錄,同時將字元串
a_
添加到復製文件的名稱中:a=(*) for fname in "${a[@]: -4}"; do cp -- "$fname" ~/a_"$fname"; done
從不同的目錄複製並重命名
如果我們使用
a=(./some_dir/*)
而不是a=(*)
,那麼我們會遇到目錄附加到文件名的問題。一種解決方案是:a=(./some_dir/*) for f in "${a[@]: -4}"; do cp "$f" ~/a_"${f##*/}"; done
另一種解決方案是使用子shell並
cd
到子shell中的目錄:(cd ./some_dir && a=(*) && for f in "${a[@]: -4}"; do cp -- "$f" ~/a_"$f"; done)
當 subshell 完成時,shell 會將我們返回到原始目錄。
確保順序一致
該問題要求“按文件名排序”的文件。Olivier Dulac 在評論中指出,這個順序會因地區而異。如果獨立於機器設置的固定結果很重要,那麼最好在定義數組時明確指定語言環境
a
。例如:LC_ALL=C a=(*)
locale
您可以通過執行命令找出您目前所在的語言環境。