폴더에 수백만 개의 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
일치하는 항목이 발견되면 여전히 이동합니다 .... 정확한 일치 항목을 얻고 파일을 이동하는 방법은 무엇입니까?
이것이 직업을 만들까요?
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
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다