2つのファイルを作成しました:sample.txt
およびsample.txt
(2番目のファイルには、スペースなどの非表示の文字が含まれています)。最新の変更されたファイルを削除するにはどうすればよいですか? Linuxを使用しています。
stat
は、このレシピの主要な要素です。問題がなければ、echo
を削除してください。
echo rm "$(stat -c "%Y:%n" * | sort -t: -n | tail -1 | cut -d: -f2-)"
プラットフォームを指定しません。これはLinuxとGNUツールです。
ファイル名に改行が含まれている場合、これは機能しないことに注意してください。
現在のディレクトリ内の最新のファイルを削除する簡単で信頼性の高い方法は次のとおりです。
zsh -c 'rm ./*(om[1])'
もちろん、zshを実行している場合は、それだけです。
rm ./*(om[1])
ls
または stat
の出力を解析するなど、このスレッドで提案されている他のソリューションとは異なり、これはどのような奇妙な文字でも機能します。ファイル名には、印刷できない文字、改行さえ含まれています。
*
の後の括弧内の文字は、 glob qualifiers です。 om
は変更時刻(最新のものが最初)でソートすることを意味し、[1]
は(ソート後)最初のファイルのみを選択することを意味します。
特定のファイルを削除したい場合、変更時間に依存することは複雑なアプローチです。代わりに、rm
と入力します SpaceTab 適切なファイルに到達するまで、シェルが提供する補完をナビゲートします。
dir
という名前のディレクトリにある最新のファイルを削除したいが、ファイル名に改行文字が含まれていない場合は、次のようにします。
rm -i -- "$(LC_CTYPE=C ls -t dir | head -1)"
ファイル名に印刷できない文字が含まれている場合、ls
が印刷できない文字を壊す可能性があるため、これが機能しない可能性があることに注意してください。
ディレクトリ内の最新のファイルが別のディレクトリである場合、rm: cannot remove ‘dir2’: Is a directory
などのエラーが発生します。
これを行う(ポータブルな)直接的な方法はありません。しかし、nix/Linuxが変更された日付で検索およびソート(受け入れられた回答がない)のソリューションの1つがあなた、それならあなたは次のようなことをするでしょう
rm -f "$(find-sorted-list | head -n 1)"
ここで、find-sorted-listには、行の先頭からトリミングする必要のあるタイムスタンプが含まれる場合があります。たとえば、sedを含むステージがあります。
sed -e 's/^[^ ]* //'
数字とコロンだけです。
ファイル名に(他の文字の中でも)スペースが含まれていることが質問で指定されているため、xargs
を使用した解決策は除外されているようです。
これは、stat
ユーティリティに依存するシェル関数です。オプションのディレクトリパラメータ(デフォルトでは現在のディレクトリである.
)を指定して呼び出すと、最も古いファイルのインタラクティブなrm
が実行されます。風に注意を向けるには、-i
フラグをrm
から削除します。意図的にディレクトリをスキップするため、指定されたディレクトリ内のファイルのみを調査します。空のディレクトリをきれいに処理するために、いくつかのshopt
回避策を追加しました。ただし、これは、名前にスペースと改行が含まれているファイルを処理する必要があります(可能な場合も同様です)。
function rmoldest {
shoptnow=$(shopt -p nullglob)
shopt -s nullglob
tstamp=$(date +%s)
file=
dir=$1
dir=${dir:-.}
for f in "$dir"/*
do
if [ ! -d "$f" ]
then
y=$(stat -c "%Y" "$f")
if [ $y -lt $tstamp ]
then
file="$f"
tstamp=$y
fi
fi
done
$shoptnow
if [ -n "$file" ]
then
/bin/rm -i "$file"
fi
}
これが実行例です(先頭の$
は私のシェルプロンプトです。入力しないでください):
$ touch sample.txt; sleep 1; touch 'sample.txt '
$ ls -l
total 0
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
$ rmoldest
/bin/rm: remove regular empty file ‘./sample.txt’? y
$ ls -l
total 0
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
$ rmoldest
/bin/rm: remove regular empty file ‘./sample.txt ’? y
$ ls -l
total 0