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

관련 정보