Shell

如何獲取目錄中的最後 N 個文件?

  • April 2, 2020

我在目錄中有許多按文件名排序的文件。我希望將最後的 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) 

當 subshel​​l 完成時,shell 會將我們返回到原始目錄。

確保順序一致

該問題要求“按文件名排序”的文件。Olivier Dulac 在評論中指出,這個順序會因地區而異。如果獨立於機器設置的固定結果很重要,那麼最好在定義數組時明確指定語言環境a。例如:

LC_ALL=C a=(*)

locale您可以通過執行命令找出您目前所在的語言環境。

引用自:https://unix.stackexchange.com/questions/181069