web-dev-qa-db-ja.com

再帰的な「ls」を使用して特定のディレクトリを除外する

次のコマンドを使用して、特定のディレクトリ内で最近更新されたファイルを(再帰的に)一覧表示し、変更時刻順に並べています。

$ stat --printf="%y %n\n" $(ls -tr $(find * -type f))

ただし、階層内には、ほぼ分単位で更新されるファイルでいっぱいのディレクトリが1つあるため、上記のコマンドは、問題のあるディレクトリ外のファイルを見つけるのにほとんど役に立ちません。

ls -Iフラグを使用してみましたが、役に立ちませんでした。

$ stat --printf="%y %n\n" $(ls -trI 'bad-dir' $(find * -type f))

lsコマンドを使用して単一/特定のディレクトリを除外する簡単な方法はありますか?または、検索をfindコマンドにプッシュする必要がありますか?

5
nickhar

余分なls -trは必要ありません。これはコマンドと同等であり、より高速です。

find . -type f | xargs stat --printf="%y %n\n" | sort -n

このようなものは、ファイルのサブディレクトリを除外します。

find . -type f ! -path './directory/to/ignore/*' \
     | xargs stat --printf="%y %n\n" \
     | sort -n

サブディレクトリ全体を無視する場合は、-Pruneを使用してください。最初にすべてのファイルが見つからないように、少し並べ替える必要があります。

find . -path './directory/to/ignore' -Prune -o -type f -print0 \
     | xargs -0 stat --printf="%y %n\n" \
     | sort -n

そして、可能な限り効率的にするために、findがすでにファイルにアクセスしていることを考えると、statは冗長でした。つまり、実際にはfind ... | stat ...アプローチでファイルシステム2Xにアクセスしているので、findがすべての作業を実行するより効率的な方法を次に示します。

find . -path './directory/to/ignore' -Prune -o -printf '%t %p\n' 
     | sort -n

このバージョンを機能させるには、statfindがさまざまなファイルシステムメタデータに異なるディレクティブを使用するため、printfディレクティブを適応させる必要がありました。

参考文献

6
slm

zshの場合:

stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)
3