web-dev-qa-db-ja.com

Xより古いファイルを含むディレクトリを検索しますか?

Linuxで、含まれているすべてのファイルとディレクトリ(およびサブディレクトリのファイルなど)が特定の経過時間よりも古いディレクトリを見つけることは可能ですか?言い換えると、ディレクトリ内に、指定されたしきい値よりも新しい変更日を持つ1つ以上のファイルがある場合、そのディレクトリすべきではないがリストされます。そのディレクトリの下にあるファイルとフォルダのallが指定されたしきい値よりも古いである場合、そのディレクトリshouldがリストされます。

ユースケースは、私のホームディレクトリが隠しディレクトリでいっぱいであり、それらの多くが以前のインストールから残っていること、そして私が何年も使用していないソフトウェアであると確信しています。これらのディレクトリを見つけられるようにしたいので、それらをカリングするかどうかを簡単に決定できます。

8
naught101

プロセス置換などを使用してファイルを作成せずにこれを行うことはおそらく可能ですが、これが手っ取り早い解決策です。

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 find on my system --%h実際のファイル名を除くパス全体を出力します)、次にそれらを並べ替えて重複を取り除き、すべてをold.txtというファイルに入れます。

2番目のコマンドも同じことを行いますが、すべてのファイルが30日以内に変更され、別のファイルnew.txtに配置されます。

Grep行は、new.txtに表示されないold.txtのすべての行を出力するため、30日以上前に最後に変更されたのみファイルを含むディレクトリのリストが表示されます。 。

これはすべてGNUバージョンのユーティリティを使用しています。構文がBSDバージョンなどで一致するかどうかはわかりません。

6
evilsoup

最後に、魔法のワンライナーを見つけました:

for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done

これにより、変更時間が30日を超え、過去30日以内にファイルが変更されていないディレクトリが出力されます。

4
Virtually Nick

これは機能するはずです:

for DIR in {the folder list}; do
   if [[ $(find ${DIR} -mtime -10 -type f) == "" ]]; then 
        echo ${DIR}
   fi
done

{フォルダリスト}内の10日より古いファイルを含むすべてのディレクトリを検索します。

基本的に、find ${DIR} -mtime -10 -type fは、10日以内に変更されたすべてのファイル(-type f)を検索します(-mtime -10、これは-atimeまたは-ctimeとは異なります。を参照してください。詳細については、こちらをご覧ください: http://www.cyberciti.biz/faq/howto-finding-files-by-date/ )。そのようなファイルがディレクトリ内に見つからない場合、このディレクトリが10日より古いことがわかり、このディレクトリをecho ${DIR}で出力します。

それが役に立てば幸い!

1
username123
find -type f -mtime +30

30日以上経過したファイルをチェックする

-iname '.*'を追加すると、隠しファイルが表示されます

またはディレクトリの場合は-type d

0
Petkaux

次の回避策を使用して、ニーズを実装できます。

$ touch -t 201206010100 some_file
$ find . -newer some_file

タッチマンページ:

-t STAMP
    use [[CC]YY]MMDDhhmm[.ss] instead of current time

タッチの-dオプションもありますが、使用していません。試してみてください。

[編集]次のようにtouch-dオプションを使用して、特定の日付にファイルを生成できます。

$ touch -d "Wed Jun 27 09:44:44 EEST 2012" some_file
$ ls -l some_file
-rw-r--r-- 1 user user 0 2012-06-27 09:44 some_file

あなたは私が上で述べたのと同じアプローチを使うことができます

0
scriptmonster