Bash 脚本根据列表中匹配的部分文件名移动文件

BashScript move files based on matching part of filenames from a list

我有数百万个 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

我能够遍历文件夹中的 xml 文件,打开每个文件并 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

这会工作得很好,虽然我犹豫要不要建议,因为它会是一种较慢的方法,因为它涉及迭代,但肯定比查看文件更快。

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