私は複雑な課題に直面しています。私は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, 1bmq1
ecc...
各ディレクトリには多くのファイルがあります。 "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の一部ではありません。特にダッシュでは使用できません。