私は2つのファイルを作成しました:
sample.txt
とsample.txt
(2番目のファイルにはスペースなどの隠し文字が含まれています)。最近変更されたファイルを削除する方法は?私はLinuxを使用しています。
答え1
stat
これはレシピの主な成分です。echo
動作がうまくいったら削除してください。
echo rm "$(stat -c "%Y:%n" * | sort -t: -n | tail -1 | cut -d: -f2-)"
プラットフォームを指定する必要はありません。これはLinuxおよびGNUツールです。
ファイル名に改行文字が含まれている場合、この方法は機能しません。
答え2
現在のディレクトリの最新のファイルを削除する簡単で信頼性の高い方法は次のとおりです。
zsh -c 'rm ./*(om[1])'
もちろん、zshを実行している場合は、
rm ./*(om[1])
このスレッドで提案されている他のソリューションとは異なり出力の解析ls
または~のstat
、これはファイル名に含まれている奇妙な文字、印刷できない文字、改行文字に関係なく機能します。
その後の括弧内の文字は次*
のとおりです。グローバル予選。om
修正時間(最も最近のファイルから)にソートすることを意味し、[1]
ソート後の最初のファイルのみを選択するという意味です。
特定のファイルを削除したい場合、変更時間に依存するのは複雑なアプローチです。代わりrm
Space Tabに、正しいファイルが見つかるまでシェルが提供する完成した項目を入力して参照してください。
答え3
名前付きディレクトリーから最新のファイルを削除し、dir
ファイル名に改行文字が含まれていない場合は、次のようにします。
rm -i -- "$(LC_CTYPE=C ls -t dir | head -1)"
ファイル名に印刷できない文字が含まれていると、ls
印刷できない文字が破損する可能性があるため、この方法が機能しない可能性があります。
そのディレクトリの最新のファイルが別のディレクトリの場合、次のエラーが発生しますrm: cannot remove ‘dir2’: Is a directory
。
答え4
これはこのユーティリティに依存するシェル関数です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