我有数百万个xml文件。 xml文件的名称遵循以下模式:
ABC_20180912_12345.xml
ABC_20180412_98765.xml
ABC_20180412_45678.xml
由此,我想根据下划线后的名称将文件复制到其他文件夹。为了识别文件,我有一个保存在csv文件中的列表,该文件为我提供了所需的名称。一个例子:
vcfile="/home/mycomp/Documents/wd/vehicles.csv"
vcpvr=`cat $vcfile`
echo $ vcpvr为我提供以下列表:
2894 4249 5464
我能够遍历文件夹中的xmlfile,打开每个文件并grep查看文件是否包含字符串,如果包含,则将文件移动到新位置。可以了
完整代码:
#filesToExtract is the interim folder
fold="/home/mycomp/filesToExtract";
query=$fold/*.xml
vcfile="/home/mycomp/Documents/wd/vehicles.csv"
vcpvr=`cat $vcfile`
#xmlfiles - keep all tar.gz files here
cd ~/xmlfiles/
COUNTER=1
for f in *.tar.gz
do
echo " $COUNTER "
tar zxf "$f" -C ~/filesToExtract
for k in $query
do
file $k | if grep -q "$vcpvr"
then
mv $k ~/xmlToWork/
fi
done
#xmltowork is the final folder
#rm -r ~/filesToExtract/*.xml
COUNTER=$((COUNTER + 1))
done
但是由于这会在文件中查找字符串而不是文件名,因此处理数百万个文件需要花费更长的时间。相反,我想在文件名中查找字符串,如果存在,请移动文件。这是我尝试过的:
target="/home/mycomp/xmlToWork"
for k in $query
do
if [[ $k =~ "$vcpvr" ]]; then
cp -v $k $target
fi
done
但这给我一个错误tarextract.sh: 12: tarextract.sh: [[: not found
答案 0 :(得分:1)
这将很好用,尽管我犹豫不决,因为它涉及到迭代,这是一种较慢的方法,但是肯定比查看文件快。
nn=($(cat vehicles.csv));for x in "${nn[@]}";do ls *.xml|grep "$x"|xargs -I '{}' mv {} folder/;done
相同的多行版本将是:
nn=($(cat test.csv))
for x in "${nn[@]}"
do
ls *.xml|grep "$x"|xargs -I '{}' mv {} /home/inderss/dumps/
done