이름의 일부를 기준으로 파일 복사

이름의 일부를 기준으로 파일 복사

폴더에 수백만 개의 XML 파일이 있습니다. 파일 이름은 특정 패턴을 따릅니다.

ABC_20190101011030931_6049414.xml

이를 위해 나는 xml 앞의 마지막 숫자 집합에만 관심이 있습니다 6049414. 텍스트 파일에는 약 8000개의 숫자가 나열되어 있습니다. 텍스트 파일의 세부 정보는 다음과 같습니다. 한 줄에 숫자가 표시됩니다.

104638
222885
108880071

다음 코드를 사용하여 텍스트 파일에 지정된 번호와 일치하는 폴더에서 파일을 이동합니다.

#folder where the xml files are stored  
cd /home/iris/filesToExtract  
SECONDS=0

#This line reads each number in the hdpvr.txt file and if a match is found moves that file to another folder called xmlfiles.  
nn=($(cat /home/iris/hdpvr.txt));for x in "${nn[@]}";do ls *.xml| grep "$x"| xargs -I '{}' cp {} /home/iris/xmlfiles;done  

#this line deletes all the other xml files from filesToExtract folder
find . -name "*.xml" -delete  
echo $SECONDS

두 가지 문제에 직면해 있습니다. 1. 일치에도 불구하고 일부 파일이 이동되지 않았습니다. 2. 파일 이름 중간에 일치하는 항목이 있음에도 불구하고;

from this ABC_20190101011030931_6049414.xml -> this 20190101011030931  

일치하는 항목이 발견되면 계속 이동됩니다... 정확히 일치하는 항목을 얻고 파일을 이동하려면 어떻게 해야 합니까?

답변1

또 다른 해결책, 감사합니다글렌 잭맨!

#!/bin/bash

# folder where the xml files are stored
xmldir=/home/iris/filesToExtract

# xml backup folder
backupdir=/home/iris/xmlfiles

while read -r line; do
    mv -t "$backupdir" *_*_${line}.xml 2>/dev/null
done <"$xmldir/hdpvr.txt"
rm -i *.xml

패턴은 *_*_${line}.xml디렉터리에서 파일을 찾는 데 사용됩니다.

나머지 xml 파일을 즉시 삭제하려면 rm -i *.xml.rm *.xml

답변2

이런 일이 일을 끝낼 수 있을까요?

pushd /home/iris/filesToExtract
for i in $(</home/iris/hdpvr.txt); do find . -mindepth 1 -maxdepth 1 -type f -name "*_$i.xml" -print0 | xargs -r -0 -i mv "{}" /home/iris/xmlfiles; done
find . -mindepth 1 -maxdepth 1 -type f -name "*.xml" -delete  
popd
  • Pushd는 지정된 디렉토리로 이동합니다.
  • for+find 라인은 텍스트 파일에서 ID를 가져오고 _ID.xml로 끝나는 파일을 찾아 /home/iris/xmlfiles 폴더로 이동합니다.
  • 마지막 찾기는 이동되지 않은 파일을 삭제하지만 하위 폴더가 아닌 이 폴더에서만 삭제됩니다.
  • popd는 원래 디렉토리로 다시 되돌려 놓을 것입니다

잔인한 작업에도 mv를 사용할 수 있지만 파일을 찾을 수 없으면 오류가 발생합니다.

pushd /home/iris/filesToExtract
for i in $(</home/iris/hdpvr.txt); do mv "*_$i.xml" /home/iris/xmlfiles; done
find . -mindepth 1 -maxdepth 1 -type f -name "*.xml" -delete  
popd

관련 정보