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