【问题标题】:xargs is incorrectly copying my src dir to one tgt directoryxargs 错误地将我的 src 目录复制到一个 tgt 目录
【发布时间】:2018-01-17 19:54:47
【问题描述】:

这个问题建立在previous question 之上。我不想编辑上一个问题,因为那样我会为已经有这么多 cmets 的问题引入新的复杂性。它会扭曲当前答案的上下文。

以下是名为mapping.txt的映射文件

src/a/  tgt/aye/
src/b   tgt/b/
src/c/  tgt/c

源文件结构如下

/tmp/testzone/src/a/afile.txt
/tmp/testzone/src/b/bfile.txt
/tmp/testzone/src/c/cfile.txt

我们要做的第一件事是根据mapping.txt文件创建目标目录文件夹结构

cut -f 2 mapping.txt | tr '\n' '\0' | xargs -0 mkdir -p

创建目标目录文件夹结构

/tmp/testzone/tgt/aye/
/tmp/testzone/tgt/b/
/tmp/testzone/tgt/c/

接下来我们运行

 xargs --arg-file mapping2.txt cp -a

这似乎将源目录内容放入目标目录的c 目录。这是错误的。它应该使用mapping.txt 文件逐行从源复制到目标。

/tmp/testzone/tgt/aye/
/tmp/testzone/tgt/b/
/tmp/testzone/tgt/c/a/afile.txt
/tmp/testzone/tgt/c/aye/
/tmp/testzone/tgt/c/b/bfile.txt
/tmp/testzone/tgt/c/c/cfile.txt

什么可能导致这个问题?

【问题讨论】:

  • 这与您不久前在 SO 中提出的问题有关。可能您应该更新您的其他问题以显示什么不起作用,而不是发布另一个问题。这个:stackoverflow.com/questions/48305724/…
  • 嗯,这不是真正的重复。为什么我要为已经有这么多 cmets 的问题引入新的复杂性?它会扭曲答案的上下文......
  • @iamauser 我同意 OP 发布单独问题的决定。在 Stack Overflow 上,强烈建议您在收到多个实质性答案后更新具有新要求的问题。
  • @tripleee 从同一用户那里看到这个:stackoverflow.com/questions/48286904/…

标签: linux bash


【解决方案1】:

如果没有其他选项来指示它,xargs 会将输入文件中尽可能多的行作为参数放入单个 cp 调用。这就是xargs 的设计目的

您可能会找到一种方法将其推向正确的方向,但这看起来您应该只是这样做

while read -r src dst; do
    mkdir -p "${dst%/*}"
    cp -a "$src" "$dst"
done<mapping2.txt

也许看看install 以进一步简化这一点,正如评论中已经建议的那样。

【讨论】:

    【解决方案2】:

    对于xargs,每个输入数据项都具有相同的“含义”——该工具旨在对所有这些项执行相同操作。

    您的输入数据项不符合该假设。 mappings.txt 文件包含源目录、目标目录、源目录等等。

    因此,您要么需要采用不同的工具/脚本(如 Tripleee 的回答中所建议的那样),要么您需要修剪输入数据,使其符合“相同项目”假设。

    修剪将要求您的输入项代表(源、目标)目录的。这样做的一个“技巧”是告诉xargs 只有个换行符(而不是任何个空格)分隔您的项目。此外,由于cp 命令的性质,必须单独处理每个输入对,一次一个。以下应该可以解决问题:

    xargs --arg-file mapping.txt --delimiter '\n' --max-args 1 -I PAIR sh -c "cp PAIR"
    

    将输入PAIR 字符串放在sh 的单独调用中会将输入对拆分为两个单独的单词,因此它们可以用作cp 的输入。

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多