プロセス置換などを使用してファイルを作成せずにこれを行うことはおそらく可能ですが、ここに簡単な解決策があります:
find . -type f -mtime +30 -printf '%h\n' | sort | uniq > old.txt
find . -type f -mtime -30 -printf '%h\n' | sort | uniq > new.txt
grep -vf new.txt old.txt
最初のコマンドは、30 日以上前に変更されたすべてのファイルのパスを出力します (find の -printf
内)。 -- 少なくとも私のシステムの GNU 検索では -- %h
実際のファイル名を除くパス全体を出力し、それらを並べ替えて重複を取り除き、全体を old.txt
というファイルに入れます .
2 番目のコマンドは同じことを行いますが、30 日以内に変更されたすべてのファイルを対象として、それらを別のファイル new.txt
に入れます。 .
grep 行は、new.txt に表示されない old.txt のすべての行を出力するため、のみ を含むディレクトリのリストが表示されます。 30 日以上前に最後に変更されたファイル。
これはすべてユーティリティの GNU バージョンを使用しています。 BSD バージョンなどで構文が一致するかどうかはわかりません。
最後に、魔法のワンライナーを見つけました:
for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done
これにより、変更時間が 30 日を超え、過去 30 日以内にファイルが変更されていないディレクトリが出力されます。