수백만 개의 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