根据文本文件中的名称搜索、匹配和复制目录到另一个



我的目标是复制大量特定目录,其名称在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到所述目录或以所述目录
  • 作为${srcdir}引用的序言。
  • OP可以根据需要添加/修改cp标志,但我假设至少需要-r才能递归地复制目录

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

假设你想把原件留在原处

最新更新