
つまり、次の種類のファイルが 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
、「ドライバ」ファイル内の番号から派生したファイル名を持つ配列をロードし、-t
GNU のオプションを使用して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
数字のリストを生成するように要求することができます。
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 個の数値がバッチで提供されます。