例えば.warの展開ディレクトリ内のファイルを誰かに直接変更されてしまったらしい場合に、そのファイルを見つけ出すワンライナーです。(実際はコマンド2発に分かれていますが、、、)
通常であればファイルのタイムスタンプが揃っているはずなのに、何らかの理由で1ファイルだけタイムスタンプが変わってしまっている場合に使えるかと思います。
コマンド1:タイムスタンプ別にファイルを集計する
ls -lR | egrep '^(r|w|x|-){7}' | awk '{print $6 " " $7 " " $8}' | sort | uniq -c | sort -r
コマンド2:指定したタイムスタンプのファイルを表示する
targetDate="[タイムスタンプ]" && ls -lR | egrep '^(r|w|x|-){7}' | fgrep "${targetDate}" | awk '{print $9}' | xargs -L 1 find ./ -name | xargs ls -l | fgrep "${targetDate}"
※ [タイムスタンプ] の部分を、コマンド1で出力したタイムスタンプで置き換えてください。
ちょっとした解説
パイプで区切られたコマンドごとに、やっていることを説明します
コマンド1について
-
ls -lR
- カレントディレクトリ以下のファイルをすべて出力します。
-
egrep '^(r|w|x|-){7}'
- ファイル以外の情報を表す行を省きます(ディレクトリも省きます)
-
awk '{print $6 " " $7 " " $8}'
- タイムスタンプ部分を切りだします。
-
sort | uniq -c | sort -r
- タイムスタンプで集計し、多い順に(イレギュラーの可能性が高いものが下にくるように)並び替えます
コマンド2について
-
targetDate="[タイムスタンプ]"
- タイムスタンプを複数回使うため、変数に保存します
-
ls -lR | egrep '^(r|w|x|-){7}'
- コマンド1と同様、カレントディレクトリ以下の全てのファイルを出力します
-
fgrep "${targetDate}"
- 指定したタイムスタンプのファイルのみを抽出します
-
awk '{print $9}'
- ファイル名のみを抽出します
-
xargs -L 1 find ./ -name | xargs ls -l
- ここからは出力にディレクトリ名をつけるための一工夫です。
- 抽出したファイル名で一つずつ再度findし、カレントディレクトリからのパスを含めて出力します。
-
fgrep "${targetDate}"
- findだけだと別ディレクトリにある同名のファイルもヒットしてしまうため、再度タイムスタンプでgrepします。
ワンライナー作ろうとするといろいろと勉強になりますね。
lsコマンドだけではファイルがどのディレクトリにあるのかを表示できないのは新たな発見でした。