我需要通过挂载点从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
这会将它找到的第一个名称复制到所有目录中
答案 0 :(得分:1)
您可以使用您拥有的内容并将变量声明移动到引用$ line的循环中,或者您可以使用IFS,如下所示。
while IFS=, read -r src filename dest
do
cp $src${filename} $dest
done <test.csv
答案 1 :(得分:0)
有很多方法可以做到,例如
如果目录字符串中没有空格:您甚至可以从shell中执行操作
sed -E 's/"/cp /; s/",/\// ; s/,/ /;s/\\/\//g' test.csv | /bin/bash
如果在您尝试之前检查,则会更好。你说的很多文件......
sed -E 's/"/cp /; s/",/\// ; s/,/ /;s/\\/\//g' test.csv | less
您可能会在目录名的字符串中空格,例如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行。
可以编写脚本:
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风格。所以我要求替换规则。