![如何将 csv 文件中引用的文件列表移动或复制到新文件夹](https://linux22.com/image/53910/%E5%A6%82%E4%BD%95%E5%B0%86%20csv%20%E6%96%87%E4%BB%B6%E4%B8%AD%E5%BC%95%E7%94%A8%E7%9A%84%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8%E7%A7%BB%E5%8A%A8%E6%88%96%E5%A4%8D%E5%88%B6%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我想编写一个 shell 脚本(OSX),它将 csv 文件中列出的文件复制到特定目录。我需要从 csv 文件中的每一行中删除引号。
我的尝试
for i in $(cat myfile.csv)
temp="${$i%\"}"
temp="${temp#\"}"
do
cp foldername/$temp foldername/subfoldername
done
我收到此错误:
./mfcsv.sh: line 2: syntax error near unexpected token `temp="${$i%\"}"'
./mfcsv.sh: line 2: ` temp="${$i%\"}"'
答案1
你有2个错误:
- 错误的循环语法,
do
应该在第二行 - 错误的替换语法,
i
需要之前没有美元符号
尝试这个:
#!/bin/bash
for i in $(cat myfile.csv)
do
temp="${i%\"}"
temp="${temp#\"}"
cp foldername/$temp foldername/subfoldername
done
但是,如果文件名中有空格,则会失败。下面的脚本也适用于空格:
#!/bin/bash
while read i;
do
temp="${i%\"}"
temp="${temp#\"}"
cp "foldername/$temp" "foldername/subfoldername"
done < myfile.csv
答案2
将 放在do
参数扩展之后,而不是之前。并在扩展中省略 $ 符号,并在扩展周围使用双引号,除非分配给变量时。例如
while read file
do
temp=${file%\"}
temp=${temp#\"}
cp "foldername/$temp" "foldername/subfoldername"
done < myfile.csv