すべてのファイルを削除し、各サブディレクトリ(特定のディレクトリから始まる)の最新のファイルのみを保持する方法についての提案はありますか?私が試したことは次のとおりです。
#!/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]
}
隠しディレクトリとファイルを考慮するには、D
glob修飾子を追加してください。
それでは、考えてみましょう。定期的な文書。デバイス、ソケット、名前付きパイプなどの他の種類のファイルが必要な場合、またはシンボリックリンクに従う場合は、より多くの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
)