Shell-Script

如何刪除具有特定副檔名的目錄中的所有文件,除了最後 5 個文件

  • April 4, 2017

該目錄包含具有不同副檔名的文件。我想刪除所有副檔名為 .gz、zx、ext4 的文件,最後 5 個文件除外。我可以列出所有這些文件

ls -l | grep '\.gz\|xz\|ext4$'

我可以展示其中最古老的 5 個:

ls -l | grep '\.gz\|xz\|ext4$' | head -5

或者列出最後 5 個文件:

ls -l | grep '\.gz\|xz\|ext4$' | tail -5

但我不知道如何刪除所有這些文件,除了上面命令中列出的這 5 個文件。

如果通常的排序順序沒問題(即您的文件按日期命名),並且您的 shell 支持數組,您可以為此使用它們,避免常見的使用警告ls

F=(./*.{gz,xz,ext4})          # list files
G=("${F[@]:5}")               # pick all but the first five to another array
G=("${F[@]:0:${#F[@]}-5}")    # or pick all but the last five
rm -- "${G[@]}"               # remove them

zsh本身可以按日期排序,所以這會將匹配的文件抓取到一個數組中,按修改時間排序

F=(./*.(gz|xz|ext4)(Om))

(Om)最新的在後,(om)最新的在前。)如上處理數組。


當然,如果您需要按修改日期排序,不能使用zsh並且知道您的文件名很好,一個簡單的ls -t | tail -n +6就可以了。 (tail -n +6從第六行開始列印,即跳過前五行。起初我對此有過錯。)

使用 GNU ls,我認為我們可以要求它引用文件名來為 shell 創建合適的輸入,然後用輸出填充數組:

eval "F=($(ls -t --quoting-style=shell-always ./*.{xz,gz}))"

但這需要相信這一點,ls並且 shell 就如何解釋引號達成一致。

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