複数のディレクトリに同じ名前の新しいリンクファイルを作成する

複数のディレクトリに同じ名前の新しいリンクファイルを作成する

名前の異なる複数のサブディレクトリに同じ名前のファイルがたくさんあります(すべて同じレベルにあるにもかかわらず)。同じファイルをすべてその名前の新しいファイルにリンクしたいと思います。この新しいファイルが親ディレクトリにあることを望みます。

SEに投稿された回答のいくつかを試しました。同じ名前のファイルを移動してリンクする方法

私が試したことと問題は次のとおりです。

find */*/*/seq/in/ -type f -name '*.fasta' -exec bash -c 'cat "{}" >> new_file' \;

これにより、名前が一致するファイルだけでなく、サフィックスが .fasta であるすべてのファイルが new_file というファイルにリンクされます。

for file in */*/*/seq/in/*.fasta; 
do 
cat "$file" >> "$file.cat" done

これは、.catが追加された同じソースサブディレクトリの各ファイルをコピーします。

私は何が間違っていましたか?とても感謝しています!

ベストアンサー1

これは2つのステップで行う必要があります。

  1. すべての一意のFastaファイル名を見つけます。
  2. 各名前について、その名前を持つすべてのファイルを見つけてリンクします。

添付コード:

すべてのFastaファイルを見つけます(ファイル名が正常で改行が含まれていないと仮定)。

find . -type f -path '*/seq/in/*.fasta' -exec basename {} ';' | sort -u -o file.list

次に、名前ごとに同じ名前のすべてのファイルを関連付けます。生成されたファイルはnew現在のディレクトリ内のディレクトリに配置されます。新しいファイルはリンクされたファイルと同じ名前を持ちます。

mkdir new
while read -r name; do
    find . -type f -path "*/seq/in/$name" -exec cat {} + >"new/$name"
done <file.list

あなたについてのもの可能find各呼び出しに追加したいのは、-mindepth 6 -maxdepth 6(または適切な深さ、6は1に減らすことができます)、ファイル階層の同じ深さからファイルをすべて取得することです。前にこれらのオプションを挿入してください-type f


別のFastaファイル名リストの生成を迂回するコメントでSteeldriverが提案した代替案:

mkdir new
find . -type f -path '*/seq/in/*.fasta' \
    -exec sh -c 'for pathname do cat "$pathname" >>"new/${pathname##*/}"; done' find-sh {} +

おすすめ記事