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

再帰的な「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コマンドに検索を入れる必要がありますか?

ベストアンサー1

さらに必要ありません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

可能な限り効率的にするために、statfindがすでにファイルにアクセスしていることを考慮すると、これは重複します。したがって、この方法を使用すると、実際にはファイルシステムに2倍以上の損傷を与える可能性があるため、これらすべてを実行するfind ... | stat ...より効率的な方法があります。find

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

このバージョンを機能させるには、printfコマンドを調整し、さまざまなファイルシステムメタデータstatfind異なるコマンドを使用する必要がありました。

引用する

おすすめ記事