xargs错误地将我的src目录复制到一个tgt目录

时间:2018-01-17 19:54:47

标签: linux bash

这个问题建立在previous question之上。我不想编辑上一个问题,因为那时我会为已经有很多评论的问题引入新的复杂性。它会扭曲当前答案的背景。

以下是名为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

可能导致此问题的原因是什么?

2 个答案:

答案 0 :(得分:1)

如果没有选项来指示它,league将从输入文件中输入尽可能多的行作为单个xargs调用的参数。这就是<{1}} 设计要做的事情。

你可能找到一种方法来向正确的方向推动它,但这看起来你应该只是做

cp

如评论中已经提到的那样,或许请查看xargs以进一步简化此操作。

答案 1 :(得分:0)

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

您的输入数据项不符合该假设。 mappings.txt文件包含源目录,然后是目标目录,然后是源目录,依此类推。

因此,您需要采用不同的工具/脚本(如tripleee的答案中所述),您需要修剪输入数据,因此它符合“相同项目”的假设。 / p>

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

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

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