私はうまく機能するFTPアカウント(刑務所の仮想ユーザーを持つvsftpd)を作成するための自動化されたシステムを持っていますが、まだ使用されていないアカウントの手動クリーンアップに頼っています。
古いアカウントの私の定義は、30日未満のファイルやフォルダが含まれていないアカウントです。
これまで私はこれを実行できます:
find /home/vsftpd -ctime +30 |awk -F'/' '{print $4}' |sort -u
これにより、フォルダを含むリストが表示されます。最後のもの30日を過ぎた文書。-ctime -30
必要な情報を得るためにリストを否定する重いループを実行して実行することもできます。
(適度に合理的な)単一のライナーでこれを行う方法があればと思いますが、この時点で私の find-foo は失敗します。誰でも助けることができますか?
答え1
私は(GNU findを使って)次のことをします:
cd /home/vsftpd &&
for i in */; do
if ! find "./$i" -ctime -30 -print -quit | grep -q .
echo no file touched in the past 30 days in "$i"
fi
done
(アカウントが/home/vsftpdより1レベル下にあると仮定)
zshを使う:
stale() (: $REPLY/**/*(NDm-30e:'exit 1':))
cd /home/vsftpd &&
echo those are stale: *(/+stale)
答え2
シングルライナーが必要な場合は、zshを使用してください。ほとんどの高度な用途と同様に、少し不思議です。グローバル予選。
echo *(/e\''set -- $REPLY/**/*(Nm-30[1]); ((!$#))'\')
外部globは、単一引用符()内の式が真になるようにディレクトリ()にのみ一致します/
。e
この式は一致するディレクトリ()を使用し、$REPLY
そのディレクトリ()で**/
過去30日間に変更されたファイル()を見つけます。m-30
一致するファイルがない場合()エラーは発生せず、N
最初の一致([1]
)のみを保持します。一致するものがない場合、式はtrueです。
別のアプローチは、最近のファイルを含むディレクトリを一覧表示してからリストを補完することです。
comm -13 <(find . -mtime -30 | sed -e '/^\.$/ d' -e 's~^\./~~' -e 's~/.*~~' | sort -u) \
<(find . -type d -name . -o -prune -print | sed -e 's~^\./~~')