【问题标题】:Search, match and copy directories into another based on names in a txt file根据 txt 文件中的名称搜索、匹配和复制目录到另一个目录
【发布时间】:2021-10-04 14:13:21
【问题描述】:

我的目标是复制大量名称在 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 行不起作用。感谢您花时间和承诺帮助我。

【问题讨论】:

  • 我打字的时候打错了

标签: linux bash directory copy


【解决方案1】:

按照当前代码的逻辑有问题所以以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)

注意事项:

  • &lt; &lt;(tr -d '\r' &lt; names.dat) 用于从names.dat 中删除 windows/dos 行结尾(来自 OP 的每个 cmets);如果更新names.dat 以删除\r',那么tr -d 将成为空操作(即,产生子进程的开销有点大,但脚本仍应正确读取names.dat
  • 假定脚本从源目录所在的目录运行,否则代码可以修改为 cd 到所述目录或在 ${srcdir} 引用前面加上所述目录
  • OP 可以根据需要添加/修改cp 标志,但我假设至少需要-r 才能递归复制目录

【讨论】:

  • 我尝试使用你的代码,它在标准输出中没有返回任何错误,但是当我检查文件是否被复制时,什么都没有。
  • 从您的 cmets 看来,您在 names.dat 中有 windows/dos 行结尾 (\r);我已更新答案以删除 \r's
  • 我认为要小心 Windows 生成的那一行。我非常感谢它成功了。
  • 为了将来参考,您可以运行dos2unix &lt;filename&gt; 以从&lt;filename&gt; 中删除\r;如果你运行dos2unix names.dat,那么你可以回到我答案的上一个版本,最后一行只是done &lt; names.dat
【解决方案2】:

UUoC.

cat names.txt | while read line; do ...; done

写得更好

while read line; do ...; done < names.txt

do grep -l '$LINE' | 正在吃掉你的输入。

printf "%s\n" 1 2 3 |while read line; do echo "Read: [$line]"; grep . | cat; done
Read: [1]
2
3

在您的情况下,很可能找不到与您嵌入在单引号标记中的文字字符串 $LINE 匹配的行,这不允许对其进行内容解析。使用"$line"(避免大写),即使匹配也无济于事:

$: printf "%s\n" 1 2 3 | grep -l .
(standard input)

你没有告诉它要读取什么,所以-l 没有意义,因为它正在读取与read 相同的标准输入流。

我觉得你想要的简单一点-

xargs cp -Rt /your/desired/target/directory/ < names.txt

假设您想将原件留在原处。

【讨论】:

  • 我使用 -l 使每一行与names.txt 中的名称匹配。我想我有点复杂,但是当我使用你最后一个更简单的代码时,我收到了这个错误cp: cannot stat 'raw1'$'\r': No such file or directory
  • @DiegoMunoz - 你在 Windows 机器上创建了names.txt 吗?
  • 它是使用 excel 创建的,我在 OSX 上将其导出为 txt
  • sed -i 's/\r$//' names.txt 应该修复它。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 2011-09-09
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多