可変サイズおよび可変コンテンツのテスト セットのテストを実行しています。データ ファイルは頻繁に追加および削除されます。ファイル リストを収集する自動化された方法を探しています。
すべてのファイルは のサブディレクトリにあります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.A
REPLY=$REPLY:r
mydir/somedir/somefile
この答え。