したがって、次の種類の約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
。d
約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
「ドライバ」ファイルの数から派生したファイル名の配列をロードし、-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 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個の数字がまとめて提供されます。