フォルダには何百万もの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
答え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