Linux は、日付別にデフォルトパスのファイルを見つけて削除します。

Linux は、日付別にデフォルトパスのファイルを見つけて削除します。

私のホームディレクトリから多くの出力ファイル(ログ、エラー、警告など)を生成するいくつかのプロセスを実行します。特定の日付(2021年9月17日と仮定)で生成された出力ファイルを見つけるために、次のコマンドを試しました。

find . -type f -newermt 2021-09-17

2021年9月17日に修正されたすべてのファイルを見つけることができます。ここ、実際に動作します。ただし、このコマンドは出力ファイルだけでなく、.historyなどのホームディレクトリの一部の隠しファイルも返します。.viminfo.cache

今私が見つけたすべてのファイルを削除しようとすると

find . -type f -newermt 2021-09-17 | xargs rm -f

隠されたファイルも致命的に削除されますか?答えが「はい」の場合、隠しファイルは保持され、出力ファイルのみを削除するようにどのように変更する必要がありますか?

答え1

find . -type f -newermt 2021-09-171行に1つずつ印刷してください。定期的なfタイプ)現在のディレクトリまたは最後のm変更時間が現地時間newerより2021-09-17T00:00:00.000000000短いサブディレクトリのすべてのレベルにあるファイルです(ただし、シンボリックリンクに従わない)。tこれには、その日に最後に変更されたファイルと、後で変更されたファイル(将来の修正ファイルを含む)が含まれます。

この出力は安定して後処理できません。一部の実装-exec rm -f {} +で使用findまたはサポートされているこれらのファイルを削除したい場合は、ほとんどがそれをサポートしています。-deletefind-newermt

ただし、何が起こっても、プロファイル、文書、写真など、削除できるすべてのファイルと隠しファイルまたは隠しディレクトリのファイルが削除されます。

隠しファイル(隠しディレクトリ内のファイルを含む)を除いて、その日に最後に変更されたファイルのみを削除するには~/.config(後で削除しない)、次の手順を実行する必要があります。

LC_ALL=C find . -name '.?*' -prune -o \
  -type f -newermt 2021-09-17 ! -newermt 2021-09-18 -exec rm -f {} +

と互換性がないため(つまり、)-deleteそこで使用できません。-delete-depth-prune

しかし、それにもかかわらず、私はそれをあなたのホームディレクトリで盲目的に実行しません。

サブディレクトリのファイルを削除せずに現在のディレクトリのファイルのみを削除するには、次の手順を実行できます。

LC_ALL=C find . -maxdepth 1 ! -name '.*' \
  -newermt 2021-09-17 ! -newermt 2021-09-18 -type f -delete

zshシェルを使用している場合は、次のこともできます。

autoload age
rm -f -- *(.e['age 2021-09-17'])

zsh globsは.NET Frameworkとは異なり、デフォルトでは隠しファイルをスキップしますfind

または再帰的(隠しファイルとディレクトリはスキップ):

rm -f -- **/*(.e['age 2021-09-17'])

¹ファイルは改行で区切られており、改行はファイル名のすべての文字と同じくらい有効なためです。詳しくは以下をご覧ください。検索結果を繰り返すのはなぜ悪い習慣ですか?

関連情報