![如何使用 csv 对目录进行子集化和复制?](https://linux22.com/image/1048602/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20csv%20%E5%AF%B9%E7%9B%AE%E5%BD%95%E8%BF%9B%E8%A1%8C%E5%AD%90%E9%9B%86%E5%8C%96%E5%92%8C%E5%A4%8D%E5%88%B6%EF%BC%9F.png)
如何使用 .csv 将一组特定目录复制并粘贴到新位置?
.csv 如下所示:
directory-name
500
505
666
900
.
.
.
1200
答案1
假设:
- CSV 文件只有一列
- 每行一个文件夹名称
- 第一行是标题,应该忽略
然后像这样的循环应该可以工作:
tail -n +2 file.csv | while read dirname; do cp -r "$dirname" /path/to/target/; done
笔记:
tail -n +2
是跳过文件的第一行(输出第二行及以后的行)- 循环
while
逐行读取文件夹名称,并对每一行执行cp -r
答案2
使用xargs
方法cp
如下。
xargs -a /path/to/file.csv cp -r -t /path/to/dest/
答案3
您可以使用选择一个子集Bash 数组切片,使用下一段代码:
#!/bin/bash
a=(`tail -n +2 folders.csv`);
b=("${a[@]:$1:$2}");
for i in "${b[@]}"
do
cp -r master_directory/"$i"/ new_path/;
done
此行b=("${a[@]:$1:$2}");
允许您向脚本传递 2 个参数并仅选择这些参数之间的文件夹,例如如果您键入:
$ bash script.sh 1 3
脚本将仅选择第 1 行和第 3 行之间的文件夹(忽略标题行)。 在您的例子中,它将选择 505、666、900 文件夹。