名前の一部に基づいてファイルをコピーする

名前の一部に基づいてファイルをコピーする

フォルダには何百万もの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 *.xmlrm *.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

関連情報