別のフォルダに同じ名前のファイルがたくさんあります。すべてのパスを見つけてテキストファイルに書き込むには?
ベストアンサー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[]
(キーとも呼ばれる)であり、最初の対応するフルパス名を保持する別のハッシュ(キーとも見なされる)です。n
p[]
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
回避策とコマンドが若干異なります。明示的な起動ディレクトリを指定する必要があります。また、このバージョンはfind
NULLで終わるファイル名を処理しないため、改行文字を含まないファイル名でのみ機能します。
find . -type f -print |
awk -F/ '{ n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'