フォルダには何百万ものXMLファイルがあります。ファイル名は特定のパターンに従います。
ABC_20190101011030931_6049414.xml
この目的のために、私はxmlの前の最後の数字セットにのみ興味があります6049414
。テキストファイルには約8000個の数字がリストされています。テキストファイルの詳細は次のとおりです。 1行に数字が表示されます。
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
2つの問題に直面しています。 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