这个问题建立在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
可能导致此问题的原因是什么?
答案 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
的输入。