何百万ものXMLファイルがあります。 xml ファイルの名前は次のパターンに従います。
ABC_20180912_12345.xml
ABC_20180412_98765.xml
ABC_20180412_45678.xml
ここでは、下線の後の名前に基づいてファイルを別のフォルダにコピーしたいと思います。ファイルを識別するために必要な名前を提供するcsvファイルに保存されているリストがあります。一例:
vcfile="/home/mycomp/Documents/wd/vehicles.csv"
vcpvr=`cat $vcfile`
echo $vcpvr は次のリストを提供します。
2894 4249 5464
フォルダ内のxmlfilesを繰り返して各ファイルを開き、grepを実行してファイルに文字列が含まれていることを確認し、その場合はファイルを新しい場所に移動できます。これはうまくいきます。
完全なコード:
#filesToExtract is the interim folder
fold="/home/mycomp/filesToExtract";
query=$fold/*.xml
vcfile="/home/mycomp/Documents/wd/vehicles.csv"
vcpvr=`cat $vcfile`
#xmlfiles - keep all tar.gz files here
cd ~/xmlfiles/
COUNTER=1
for f in *.tar.gz
do
echo " $COUNTER "
tar zxf "$f" -C ~/filesToExtract
for k in $query
do
file $k | if grep -q "$vcpvr"
then
mv $k ~/xmlToWork/
fi
done
#xmltowork is the final folder
#rm -r ~/filesToExtract/*.xml
COUNTER=$((COUNTER + 1))
done
ただし、これはファイル名ではなくファイル内の文字列を見つけるため、何百万ものファイルを処理するのに時間がかかります。代わりに、ファイル名から文字列を見つけて文字列がある場合は、ファイルを移動したいと思います。私が試したことは次のとおりです。
target="/home/mycomp/xmlToWork"
for k in $query
do
if [[ $k =~ "$vcpvr" ]]; then
cp -v $k $target
fi
done
しかし、これはエラーを引き起こします。tarextract.sh: 12: tarextract.sh: [[: not found
答え1
$cvfileもリストしますか?だから私はそうします:
for k in "$query"
do
for l in "$cvfile"
do
if [[ "$k" =~ "$l" ]]
then
cp -v "$k" "$target"
fi
done
done