非常に複雑なファイルコピープロセス

非常に複雑なファイルコピープロセス

私は複雑な課題に直面しています。私はLinuxとスクリプトに精通していませんが、問題を解決する必要があります。 2つの列を含むlist.txtファイルがあります。最初の列はオブジェクト名、2番目の列は変数です。この情報を使用して、特定のディレクトリの特定のファイルをコピーしたいと思います。たとえば、

作業ディレクトリは次のとおりです。/nfs/BioGPSDB/pockets/MD/fixed/1/

ファイルは次のとおりです/home/tommaso/Desktop/list.txt

121p1_004_______________  GCP
13gs1_001_______________  SAS
1am42_003_______________  GNP
1bmq1_003_______________  MNO
   ecc...

以下の作業ディレクトリには多くのディレクトリがあり、その中には "list.txt"ファイルの最初の列にあるオブジェクト名の最初の5文字に関連する名前があります。例: 1j4r3, 1t403, 121p1,1sdr4, 1bmq1ecc...

各ディレクトリには多くのファイルがあります。 "list.txt"ファイルの各行に最初の列を使用してディレクトリを選択するには、このディレクトリに移動して目的のファイルを選択して別のディレクトリにコピーする必要があります(/home/tommaso/Desktop/pdb_files)。関心のあるファイルは、「list.txt」ファイルの2番目の列に報告された変数と同様に呼び出されます。例:

directory: /nfs/BioGPSDB/pockets/MD/fixed/1/121p1
File of interest: "GCP_?.pdb" where "?" is one character (letter or number)
Final directory: /home/tommaso/Desktop/pdb_files

したがって、最終的にディレクトリには/home/tommaso/Desktop/pdb_files次のすべてのファイルが必要です。 GCP_?.pdb, SAS_?.pdb, GNP_?.pdb, MNO_?.pdb ecc..

したがって、スクリプトはlist.txtファイルを読み取る必要があり、最初の列の各行に最初の5文字という名前の各ディレクトリに対して2番目の列に変数というファイルをコピーする必要があり、すべてのファイルの拡張子をコピーする"_?.pdb"と最終ディレクトリに表示されます。

十分に明確であればと思います。どこから始めるべきかわからないので、私を助けてくれる人を探してください!

答え1

以下を使用してこれを実行できる必要があります。

cd /nfs/BioGPSDB/pockets/MD/fixed/1/
while IFS= read -r line
do
  echo cp -i -- "${line:0:5}/${line##* }"_?.pdb /home/tommaso/Desktop/pdb_files/
done < /home/tommaso/Desktop/list.txt

印刷されたコマンドが満足な場合は、削除してecho実際にファイルをコピーしてくださいcp

あなたが持っていると仮定一つファイルは${line##* }"_?.pdb各ディレクトリのパターンと一致します。コマンドラインを次のように_?.pdb変更することもできますcp

cp -i -- "${line:0:5}/${line##* }"_?.pdb \
  "/home/tommaso/Desktop/pdb_files/${line##* }_?.pdb"

この-iオプションは、cp要件に応じて、ターゲットディレクトリのファイルを上書きする前に確認するように指示します。これは必要ありませんが、別のディレクトリのファイルを単一のディレクトリにコピー/移動する場合は意味があります。

スクリプトは、各ファイル名のフラグメントの前に1つ以上のスペースがあると仮定しますlist.txt。該当する場合は、スペースを${line##* }ファイル名部分の直前の文字に置き換えます。

さまざまなシェル(bash、ksh93、zsh、busybox ashなど)は、「インデックス0(最初の文字)で始まる変数${line:0:5}の5文字のサブストリングに置き換える」というこの拡張をサポートしていますlineが、POSIXの一部ではありません。特にダッシュでは使用できません。

関連情報