web-dev-qa-db-ja.com

最新の変更されたファイルを削除します

2つのファイルを作成しました:sample.txtおよびsample.txt (2番目のファイルには、スペースなどの非表示の文字が含まれています)。最新の変更されたファイルを削除するにはどうすればよいですか? Linuxを使用しています。

1
teja

statは、このレシピの主要な要素です。問題がなければ、echoを削除してください。

echo rm "$(stat -c "%Y:%n" * | sort -t: -n | tail -1 | cut -d: -f2-)"

プラットフォームを指定しません。これはLinuxとGNUツールです。

ファイル名に改行が含まれている場合、これは機能しないことに注意してください。

2
glenn jackman

現在のディレクトリ内の最新のファイルを削除する簡単で信頼性の高い方法は次のとおりです。

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などのエラーが発生します。

1
RobertL

これを行う(ポータブルな)直接的な方法はありません。しかし、nix/Linuxが変更された日付で検索およびソート(受け入れられた回答がない)のソリューションの1つがあなた、それならあなたは次のようなことをするでしょう

rm -f "$(find-sorted-list | head -n 1)"

ここで、find-sorted-listには、行の先頭からトリミングする必要のあるタイムスタンプが含まれる場合があります。たとえば、sedを含むステージがあります。

sed -e 's/^[^ ]* //'

数字とコロンだけです。

ファイル名に(他の文字の中でも)スペースが含まれていることが質問で指定されているため、xargsを使用した解決策は除外されているようです。

0
Thomas Dickey

これは、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
0
Jeff Schaller