从csv中列出的挂载点复制文件

时间:2014-05-30 14:42:40

标签: bash loops unix awk copy

我需要通过挂载点从1台服务器移动超过100,000 img,我有一个列出的.csv,我正在寻找脚本 csv看起来像这样

"images1\002_0001\thumb",53717902.jpg,/www/images/002_0001/thumb/
"images1\002_0001\thumb",53717901.jpg,/www/images/002_0001/thumb/
"images1\002_0001\thumb",53717900.jpg,/www/images/002_0001/thumb/

逗号分隔,我们有源名称和目的地

我正在考虑使用awk将每个创建为变量

SOURCE=`awk -F ',' '{ print $1 }' test.csv`
IMGNAME=`awk -F ',' '{ print $2 }' test.csv`
DEST=`awk -F ',' '{ print $3 }' test.csv`

这就是我陷入困境的地方,我的循环

while read line
do
    cp $SOURCE${IMGNAME} $DEST
done <test.csv

这会将它找到的第一个名称复制到所有目录中

2 个答案:

答案 0 :(得分:1)

您可以使用您拥有的内容并将变量声明移动到引用$ line的循环中,或者您可以使用IFS,如下所示。

   while IFS=, read -r src filename dest
   do
      cp $src${filename} $dest
   done <test.csv

答案 1 :(得分:0)

有很多方法可以做到,例如

  1. 如果目录字符串中没有空格:您甚至可以从shell中执行操作 sed -E 's/"/cp /; s/",/\// ; s/,/ /;s/\\/\//g' test.csv | /bin/bash
    如果在您尝试之前检查,则会更好。你说的很多文件......
    sed -E 's/"/cp /; s/",/\// ; s/,/ /;s/\\/\//g' test.csv | less

  2. 您可能会在目录名的字符串中空格,例如My Windows Like Dir Name。在这种情况下,你需要双引号(即使出于这个原因,也有双引号......)
    您只能使用awk(始终来自shell)来执行此操作 awk -F',' '{gsub(/"/, "", $1); gsub(/\\/, "/", $1); print "cp \""$1"/" $2"\" \"" $3"\""}' test.csv | /bin/bash
    或者相当于 awk -F',' '{gsub(/"/, "", $1); gsub(/\\/, "/", $1); printf ("cp \"%s/%s\" \"%s\"\n",$1,$2,$3)}' test.csv | /bin/bash
    请务必提前检查,避开最后一根烟斗|/bin/bash,可能| head -n 10只有前10行。

  3. 可以编写脚本:

      while IFS=, read -r SOURCE IMGNAME DEST
      do
       SOURCE=( ${SOURCE//\\/\/} )         # Here you need to change "\" in "/"
       SOURCE=( ${SOURCE//\"/} )           # Here I like to kill ""
       cp  "${SOURCE}/${IMGNAME}" "$DEST"  # Here I put again ""
      done <test.csv
    

    注意:我认为您需要更改&#34; \&#34; windows风格&#34; /&#34; unix风格。所以我要求替换规则。