同じ名前のすべてのファイルを探す

同じ名前のすべてのファイルを探す

別のフォルダに同じ名前のファイルがたくさんあります。すべてのパスを見つけてテキストファイルに書き込むには?

ベストアンサー1

これは重複したファイル名があることを知っていますが、それが何であるかわからない一般的なケースを処理します。

find -type f -print0 |
    awk -F/ 'BEGIN { RS="\0" } { n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'

awkスクリプトはNULLで終わるファイルパスを処理し(したがって改行文字を含むことができるファイル名を処理できます)、それを$0現在のファイルパス名にします。この変数はnファイル名部分を保持します。このファイル名の発生回数を計算するハッシュk[](キーとも呼ばれる)であり、最初の対応するフルパス名を保持する別のハッシュ(キーとも見なされる)です。np[]n

はい

# Preparation
mkdir -p tmp/a tmp/b
touch tmp/a/xx tmp/a/yy tmp/b/yy tmp/b/zz

# Do it
find tmp -type f -print0 |
    awk -F/ 'BEGIN { RS="\0" } { n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'

tmp/a/yy
tmp/b/yy

# Tidyup
rm -rf tmp

POSIXを使用している場合find(Macを使用している場合など)、対応するオプションがないため、-print0回避策とコマンドが若干異なります。明示的な起動ディレクトリを指定する必要があります。また、このバージョンはfindNULLで終わるファイル名を処理しないため、改行文字を含まないファイル名でのみ機能します。

find . -type f -print |
    awk -F/ '{ n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'

おすすめ記事