BashScript は、リスト内の一致するファイル名部分に基づいてファイルを移動します。

BashScript は、リスト内の一致するファイル名部分に基づいてファイルを移動します。

何百万もの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

おすすめ記事