複雑なファイルのコピーと名前変更

複雑なファイルのコピーと名前変更

特定のディレクトリに多くのファイルがあります。たとえば、

  • ディレクトリがあります:/home/scrivania/pdb_files内容:
    UN4_A.pdb
    VIV_A.pdb
    XMG_A.pdb
    Z34_A.pdb
    ZAR_A.pdb
    ZTW_B.pdb
    
  • さらに、file() には次のオブジェクトのリストがあります"list.txt"
    VIV
    XMG
    ZTW
    

/home/scrivania/news/私は作業ディレクトリから別のディレクトリにファイルに存在するファイルをコピーしたいと思います"list.txt"

ディレクトリの末尾には、news次の3つのファイルのみが必要です。

VIV_A.pdb
XMG_A.pdb
ZTW_B.pdb

また、最初のスクリプトとは異なるスクリプトを使用して、各ファイルの最初の3文字と拡張子(.pdb)のみを使用して新しいディレクトリのファイル名を変更したいと思います。したがって、最終ディレクトリの内容は次のようになります。

VIV.pdb
XMG.pdb
ZTW.pdb

誰でも私を助けることができますか?ありがとう

答え1

ファイル名のルートが外部ファイルにある場合は、bashループを使用してその内容を繰り返すことができます。

#!/bin/bash
shopt -s  nullglob

sourcedir=/home/scrivania/pdb_files
targetdir=/home/scrivania/news/

while IFS= read -r froot
do
    for file in "$sourcedir/$froot"*.pdb
    do
        cp "$file" "$targetdir/$froot.pdb"
    done
done < list.txt
  • これはファイル内の項目を繰り返し、次の3文字で始まり、で終わるファイルを繰り返します.pdb。ソースディレクトリにそのファイルが1つしかないと指定したので、この内部forループはから始まるために使用されますlist.txtshopt -s nullglobそのようなファイルが存在しない場所(可能性が低い)で、ループがそのファイルを見つけないことを確認してください。
  • 「内部」forループでは、スクリプトはファイルをターゲットディレクトリにコピーします。現在の形式では、指定したファイルがコピーされるとファイル名が変更されます。これが望ましくない場合は、行を次に変更します。
    cp "$file" "$targetdir"
    
    2番目のスクリプトで名前を変更します。
  • 3文字で始まるファイルが常にあると確信している場合は、ループを省略してfor次に置き換えることができます。
    cp "$sourcedir/$froot"*.pdb "$targetdir/$froot.pdb"
    

答え2

#!/bin/bash
入力="ファイル.txt"
IFS= は -r 行を読み込んでいる間
する
 /bin/cp "${line}_A.pdb" "/home/scrivania/news/${line}.pdb"
完璧

すべきこと。

答え3

#!/usr/bin/sh

for XXX in $(cat list.txt)
do
  cp /tmp/home/scrivania/pdb_files/${XXX}*.pdb /tmp/home/scrivania/news/$XXX.pdb
done

関連情報