このディレクトリには、さまざまな拡張子を持つファイルが含まれています。最後の5つのファイルを除いて、拡張子が.gz、zx、ext4のすべてのファイルを削除したいと思います。これらすべてのファイルを一覧表示できます。
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つのファイルを除くすべてのファイルを削除する方法はわかりません。
答え1
一般的なソート順序が適切であり(つまり、ファイル名が日付別に指定されている場合)、シェルが配列をサポートしている場合は、配列を使用して以下を回避できます。使用時の一般的な注意事項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
印刷は6行目から始まります。つまり、最初の5行目をスキップします。最初はこれに偏見がありました。)
GNU lsを使用すると、シェルに適した入力を生成するためにファイル名を引用するように要求し、出力に配列を埋めることができると思います。
eval "F=($(ls -t --quoting-style=shell-always ./*.{xz,gz}))"
しかし、これを行うには、それを信じてls
シェルが引用文を解釈する方法に同意する必要があります。
答え2
ls -1 | grep '\.gz$\|xz$\|ext4$' | tail -n +6 | xargs rm
注:ファイルにはスペース/引用符を含めないでください。
set -f; set ./*.[gx]z ./*.ext4; [ "$#" -gt 5] && shift 5; rm -f "$@"
以下は、すべての種類のファイル名に適用されます。
td="`mktemp`" \
find . -maxdepth 1 -type f \( -name \*.[gx]z -o -name \*.ext4 \) -exec sh -c '
[ ! -s "$td" ] && [ "$#" -gt 5 ] && { shift 5; echo >> "$td"; }
rm -f "$@"
' x {} +
rm "$td"
答え3
ほぼすべて来ました。
長いオプション形式を使用して目的の行数を指定し、それを無効にします。 (反対のロジックを一緒に使用できますtail
)。
head --lines=3
ヘッダーから3行を印刷します。
head --lines=-3
最後の3つを除いて、頭からすべてを印刷します。
head
以下は、aと8行のファイルを使用する例です。f
$ cat f
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
$ head -3 f
line 1
line 2
line 3
$ head --lines=3 f
line 1
line 2
line 3
$ head --lines=-3 f
line 1
line 2
line 3
line 4
line 5
ファイルの削除を開始する前に、このセクションで目的の結果が表示されていることを確認してください。
長いオプションは必ずしも必要ではありませんが、tailおよびheadコマンドの進化と以前のバージョンと互換性がなければならない遺産がなく、覚えやすくなります。
head -n-3
枚数オプションと同じhead --lines=-3 f
下記をご覧ください
$ head -3 f #originally
line 1
line 2
line 3
$ head -n3 f #
line 1
line 2
line 3
$ head -n+3 f
line 1
line 2
line 3
$ head -n-3 f
line 1
line 2
line 3
line 4
line 5
$
答え4
次のコマンドは、最後の5つのファイルを除くすべてのファイルを一覧表示します。
ls -l | grep '\.gz\|xz\|ext4$' | head -n `expr \`ls | grep '\.gz\|xz\|ext4$' | wc -l\` - 4`
ファイルを簡単に削除するには、それをコマンドに変換できる必要があります。