すべてのファイルを削除して最新のファイルのみを保持するスクリプト

すべてのファイルを削除して最新のファイルのみを保持するスクリプト

すべてのファイルを削除し、各サブディレクトリ(特定のディレクトリから始まる)の最新のファイルのみを保持する方法についての提案はありますか?私が試したことは次のとおりです。

#!/bin/bash

find /home/ftp/ -type f | while IFS= read -r line
do
  find "$line" -type f | head -n -1 | while read file
  do
    #rm -f "$file"
    echo "$file"
  done
done

/home/ftp/uploadと/home/ftp/downloadには2つのサブディレクトリがあります。 2つのサブディレクトリにはそれぞれ2つのファイルがあります。

上記のスクリプトをテストすると、ファイル名はエコーされません。

ベストアンサー1

zsh現在のディレクトリでを使用してください。

for dir (**/*(N/)) {
  files=($dir/*(N.om))
  (($#files > 1)) && echo rm -f -- $files[2,-1]
}

隠しディレクトリとファイルを考慮するには、Dglob修飾子を追加してください。

それでは、考えてみましょう。定期的な文書。デバイス、ソケット、名前付きパイプなどの他の種類のファイルが必要な場合、またはシンボリックリンクに従う場合は、より多くのglob修飾子を使用して調整できます。

echo実際に作業を行うには、削除してください。

最新のGNUツールとPOSIXシェルを使用してください。

(export LC_ALL=C
find . -type f -printf '%T@\t%p\0' |
  sort -rzn |
  cut -zf2- |
  gawk -v RS='\0' -v ORS='\0' '
    match($0,/.*\//) && n[substr($0,1,RLENGTH-1)]++' |
  xargs -r0 echo rm -f
)

おすすめ記事