ディレクトリ内のペアの名前を持つファイルを検索する

ディレクトリ内のペアの名前を持つファイルを検索する

可変サイズおよび可変コンテンツのテスト セットのテストを実行しています。データ ファイルは頻繁に追加および削除されます。ファイル リストを収集する自動化された方法を探しています。

すべてのファイルは のサブディレクトリにありますD。完全なディレクトリと名前をテキスト ファイルに追加する必要があります。ただし、必要なのは、同じファイル名で拡張子が異なる (つまり、構造化された方法でファイル名が異なる)「ペア」ファイルを持つファイルだけです。したがって、 と がある場合はMyFileName.A、をファイル リストに追加するMyFileName.B必要があります。D/.../MyFileName

.Aファイルのないファイルは存在します.Bが、ファイル.Bのないファイルはありません.A。 aにファイル.Aがある場合.B、両方のファイルは同じディレクトリにあります。

何かアドバイス?

答え1

ファイル名に改行が含まれていない場合は、次のようにします。

find D -type f \( -name '*.A' -o -name '*.B' \) |
  sed 's/\.[^.]*$//' |
  sort |
  uniq -d >paired_files

.Bこれは、ファイルがないファイルが存在する、より一般的なケースでは機能するはずです.A

最近の GNU ツールを使用して任意のファイル名を処理するには:

find D -type f \( -name '*.A' -o -name '*.B' \) -print0 |
  sed -z 's/\.[^.]*$//' |
  sort -z |
  uniq -dz |
  tr '\0' '\n' >paired_files

答え2

「.A ファイルがなければ .B ファイルは存在しない」という記述が正しい場合は、.B ファイルのリストを取得し、拡張子を削除します。

find $directory-to-search -name "*.B" | sed -r -e "s~(.*)\.B~\1~g"

答え3

zsh

print -rl mydir/**/*.A(.e_'REPLY=$REPLY:r; [[ -f $REPLY.B ]]'_)

:rは拡張子を削除するので、を実行した後の$REPLY内容はとなり、 残りは と同様になります。mydir/somedir/somefile.AREPLY=$REPLY:rmydir/somedir/somefile
この答え

関連情報