我的目标是复制大量特定目录,其名称在txt文件中,如下所示:
$ cat names.txt
raw1
raw2
raw3
raw4
raw5
这些目录有子目录,因此复制所有内容很重要。当我在终端中列出时,它看起来像这样:
$ ls -l
raw3
raw7
raw1
raw8
raw5
raw6
raw2
raw4
要执行此任务,我尝试了以下操作:
cat names.txt | while read line; do grep -l '$line' | xargs -r0 cp -t <desired_destination>; done
但是,我得到了这个错误
cp: cannot stat No such file or directory
我想这是因为文件列表(names.txt
)中的名称与终端中的名称排序不匹配。注意,它们是无序的,使用while read line不能工作。谢谢你花时间和承诺来帮助我。
对当前代码的逻辑有问题,所以我以K.I.S.S.
的名义提出:
tgtdir=/my/target/directory
while read -r srcdir
do
[[ -d "${srcdir}" ]] && cp -rp "${srcdir}" "${tgtdir}"
done < <(tr -d 'r' < names.dat)
指出:
< <(tr -d 'r' < names.dat)
用于从names.dat
中删除windows/dos行结尾(根据OP的注释);如果names.dat
被更新以删除r
',那么tr -d
将是一个无操作(即,产生子进程的开销,但脚本仍然应该正确读取names.dat
)- 假设脚本是从源目录所在的目录运行的,否则代码可以修改为
cd
到所述目录或以所述目录 作为 - OP可以根据需要添加/修改
cp
标志,但我假设至少需要-r
才能递归地复制目录
${srcdir}
引用的序言。UUoC.
cat names.txt | while read line; do ...; done
最好写成
while read line; do ...; done < names.txt
do grep -l '$LINE' |
正在吃你的输入
printf "%sn" 1 2 3 |while read line; do echo "Read: [$line]"; grep . | cat; done
Read: [1]
2
3
在您的例子中,很可能找不到与您嵌入在单引号中的文本字符串$LINE
匹配的行,这不允许对其进行内容解析。使用"$line"
(避免大写字母),即使匹配也没有帮助:
$: printf "%sn" 1 2 3 | grep -l .
(standard input)
你没有告诉它读取什么,所以-l
是毫无意义的,因为它读取的是与read
相同的stdin流。
我觉得你想要的更简单一点-
xargs cp -Rt /your/desired/target/directory/ < names.txt
假设你想把原件留在原处