テキストファイルのリストから特定のファイルを移動またはコピーする方法

テキストファイルのリストから特定のファイルを移動またはコピーする方法

したがって、次の種類の約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

これらのファイル間の唯一の違いは、次の数字ですdd約50個のファイルのみを含むテキストファイルがあります。完全なファイル名を取得できますが、このテキストファイルは別のスクリプトの出力です。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個の数字がまとめて提供されます。

関連情報