テキストファイルのリストから特定のファイルを移動またはコピーするにはどうすればいいですか

テキストファイルのリストから特定のファイルを移動またはコピーするにはどうすればいいですか

つまり、次の種類のファイルが 200 個ほど入ったディレクトリがあります。

gre_6_c1_d34567.h3
gre_6_c1_d95543.h3
gre_6_c1_d42354.h3
gre_6_c1_d01452.h3
gre_6_c1_d23168.h3
gre_6_c1_435435.h3

これらのファイル間の唯一の違いは、 の後の数字ですd。これらのファイルの 50 個ほどの番号のみを含むテキスト ファイルがありますd。ファイル名全体を取得できればそうしますが、このテキスト ファイルは別のスクリプトの出力です。dテキスト ファイルの番号を使用して、これらのファイルを別のディレクトリに移動する方法はありますか?

答え1

フラグの使用 sed e:

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|e' list.txt

上記では、それに応じてファイルを移動してnewdir/変更します。

list.txt では、番号は以下のように改行で区切られていると想定します。

d34567
d23168

確認するにはこれを実行します:

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|' list.txt

答え2

4ではbash、「ドライバ」ファイル内の番号から派生したファイル名を持つ配列をロードし、-tGNU のオプションを使用してmvそれらを一度にディレクトリに移動することができます。注

#read contents of driver_file into an array arr using mapfile
mapfile -t arr <driver_file

#define prefix and suffix variables
prefix=gre_6_c1_d
suffix=.h3

#prefix each array element
arr=("${arr[@]/#/$prefix}")

#suffix each array element
arr=("${arr[@]/%/$suffix}")

#use GNU mv's -t facility to move files into newdir
mv -t newdir/ "${arr[@]}"

答え3

ファイルから数字を 1 つずつ読み取り、移動を実行します (POSIX シェルを想定)。

while read -r number; do
   name="gre_6_c1_d$number.h3"
   [ -f "$name" ] && mv -i "gre_6_c1_d$number.h3" /other/directory
done <number.list

これにより、他のディレクトリに移動する前に、現在のディレクトリに存在するファイルの名前が数値によって返されることも確認されます。さらに、コマンドはmv -i既存のファイルを上書きする前に確認を求めます。


この質問にはxargs数字のリストを生成するように要求することができます。

xargs sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

これでは何もスピードアップしませんが、並列実行するためのフラグxargsを提供すると、速度がわずかに向上する可能性があります。-P

xargs -P 5 -n 10 -h sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

これにより、最大 5 つのループのコピーが並列に開始され、それぞれ最大 10 個の数値がバッチで提供されます。

関連情報