Shell-Script
如何刪除具有特定副檔名的目錄中的所有文件,除了最後 5 個文件
該目錄包含具有不同副檔名的文件。我想刪除所有副檔名為 .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 就如何解釋引號達成一致。