特定のディレクトリに多くのファイルがあります。たとえば、
- ディレクトリがあります:
/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.txt
。shopt -s nullglob
そのようなファイルが存在しない場所(可能性が低い)で、ループがそのファイルを見つけないことを確認してください。 - 「内部」
for
ループでは、スクリプトはファイルをターゲットディレクトリにコピーします。現在の形式では、指定したファイルがコピーされるとファイル名が変更されます。これが望ましくない場合は、行を次に変更します。
2番目のスクリプトで名前を変更します。cp "$file" "$targetdir"
- 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