テキストファイルの名前に基づいてファイルを新しいディレクトリにシンボリックリンクする方法は?

テキストファイルの名前に基づいてファイルを新しいディレクトリにシンボリックリンクする方法は?

というディレクトリがありますSTRBAM。そのうち、.bam他のディレクトリには次のファイルがあります。symbolic linked

Sample-CK-4952-01A-01D-1719-10.bam
Sample-A6-5656-01A-21D-A270-10.bam
Sample-AZ-4315-01A-01D-1408-10.bam
Sample-T9-A92H-01A-11D-A36X-10.bam
Sample-DY-A1H8-01A-21D-A152-10.bam
Sample-DC-5869-01A-01D-1657-10.bam
Sample-CI-6623-01B-11D-1826-10.bam
Sample-AA-3980-01A-02W-0995-10.bam
Sample-F4-6569-01A-11D-1771-10.bam

All.txtまた、同じディレクトリに次の情報を含むテキストファイルがあります。

    submitter_id                    Patient
Sample-CK-4952-01A-01D-1719-10  Sample-CK-4952
Sample-A6-5656-01A-21D-A270-10  Sample-A6-5656
Sample-AZ-4315-01A-01D-1408-10  Sample-AZ-4315
Sample-T9-A92H-01A-11D-A36X-10  Sample-T9-A92H
Sample-DY-A1H8-01A-21D-A152-10  Sample-DY-A1H8
Sample-DC-5869-01A-01D-1657-10  Sample-DC-5869

別のディレクトリがありますNEW。ディレクトリ内のファイル.bamの情報を使用して、ファイルをディレクトリにシンボリックリンクしたいと思います。All.txtSTRBAMNew

ディレクトリの出力は次のようになりますNew

Sample-CK-4952-01A-01D-1719-10.bam
Sample-A6-5656-01A-21D-A270-10.bam
Sample-AZ-4315-01A-01D-1408-10.bam
Sample-T9-A92H-01A-11D-A36X-10.bam
Sample-DY-A1H8-01A-21D-A152-10.bam
Sample-DC-5869-01A-01D-1657-10.bam

awk以下を実行するためにコマンドを使用しようとしましたが、ファイルの情報を使用して必要な必要なファイルのみをリンクするのではなく、すべてのファイルをリンクしましたxargsAll.txt

awk 'NR > 1{ print $1 }' All.txt | xargs -I {} ln -s /path/to/STRBAM/* /path/to/New/

答え1

ソースパスの代わりにaを使用するので、すべてのファイルを/path/to/STRBAM/*複数/path/to/New/回接続します。つまり:*{}

awk 'NR > 1{ print $1 }' All.txt | xargs -I{} ln -s /path/to/STRBAM/{}.bam /path/to/New/

ソースディレクトリにシンボリックリンクがあることを確認するために追加のチェックを追加するには、小さなシェルスクリプトを使用し、ソースディレクトリとターゲットディレクトリを最初の2つの場所引数としてスクリプトに渡します。

awk 'NR > 1{ print $1 }' All.txt | xargs sh -c '
 src=$1; shift
 dest=$1; shift
 for i do
   if [ -h "$src/${i}.bam" ]; then
     ln -s "$src/${i}.bam" "$dest"
   fi
 done
' sh /path/to/STRBAM /path/to/New

関連情報