Bash: 使用 xargs 复制文件。为什么我将它作为 xargs 的最后一个参数返回?
Bash: Copying files with xargs. Why do I get this returned as the last argument by xargs?
我已经通过这些命令将一些文件从一个用户帐户复制到一个新帐户
$ folders_array=(.mozilla .thunderbird .ssh .eclipse)
$ echo ${folders_array[@]} | xargs -d " " -I _ sudo cp -r _ /home/nebukadnexa/
我无法解释最后一个参数 .eclipse
的形式,即它是 '.eclipse'$'\n'
,因此在我当前的主目录中找不到,因此也没有被复制当然。
你能告诉我 xargs 如何生成参数 '.eclipse'$'\n'
(作为最后一个参数)吗?
编辑:也许比 -d " "
更好的解决方案是 tr " " "\n"
?
echo ${folders_array[@]} | tr " " "\n" | xargs -I _ printf "%s\n" _
当您设置 -d " "
时,echo
输出末尾的换行符被视为数据的一部分,而不是分隔符。
绝对最简单的解决方法是不在一行中提供输入。 (还要注意数组的固定引用。)
printf '%s\n' "${folders_array[@]}" |
xargs -r sudo cp -t -r /home/nebukadnexa/
我还切换到 cp -t
,它恰好存在,以便您可以简化这样的情况。这是一个 GNU 扩展,因此它不一定可以移植到非 Linux 平台(尽管编写自己的重新实现也不难)。
如果您需要支持完全任意的文件名(甚至是包含换行符的文件名),printf '%s[=14=]'
管道到 xargs -0
是个好消息,不过,这又是一个 GNU 扩展。
不确定我在这里看到 xargs
的好处。
for d in .mozilla .thunderbird .ssh .eclipse
do sudo cp -r "$d" /home/nebukadnexa/
done
问题是,当您使用 -I _
时,它会将 _
替换为单个参数。 POSIX 指定这个(强调我的):
-I replstr
Insert mode: utility is executed for each line from standard input, taking the entire line as a single argument, inserting it in arguments for each occurrence of replstr.
这就是 GNU cp -t
扩展很有用的原因。它允许您将要复制的文件放在命令的末尾,这是 xargs
默认放置它们的位置,而不会将它们组合成一个参数。
echo "${folders_array[@]}" | xargs sudo cp -r -t /home/nebukadnexa/
请注意,如果任何文件名包含空格,则无法通过管道传输到 xargs
。
我已经通过这些命令将一些文件从一个用户帐户复制到一个新帐户
$ folders_array=(.mozilla .thunderbird .ssh .eclipse)
$ echo ${folders_array[@]} | xargs -d " " -I _ sudo cp -r _ /home/nebukadnexa/
我无法解释最后一个参数 .eclipse
的形式,即它是 '.eclipse'$'\n'
,因此在我当前的主目录中找不到,因此也没有被复制当然。
你能告诉我 xargs 如何生成参数 '.eclipse'$'\n'
(作为最后一个参数)吗?
编辑:也许比 -d " "
更好的解决方案是 tr " " "\n"
?
echo ${folders_array[@]} | tr " " "\n" | xargs -I _ printf "%s\n" _
当您设置 -d " "
时,echo
输出末尾的换行符被视为数据的一部分,而不是分隔符。
绝对最简单的解决方法是不在一行中提供输入。 (还要注意数组的固定引用。)
printf '%s\n' "${folders_array[@]}" |
xargs -r sudo cp -t -r /home/nebukadnexa/
我还切换到 cp -t
,它恰好存在,以便您可以简化这样的情况。这是一个 GNU 扩展,因此它不一定可以移植到非 Linux 平台(尽管编写自己的重新实现也不难)。
如果您需要支持完全任意的文件名(甚至是包含换行符的文件名),printf '%s[=14=]'
管道到 xargs -0
是个好消息,不过,这又是一个 GNU 扩展。
不确定我在这里看到 xargs
的好处。
for d in .mozilla .thunderbird .ssh .eclipse
do sudo cp -r "$d" /home/nebukadnexa/
done
问题是,当您使用 -I _
时,它会将 _
替换为单个参数。 POSIX 指定这个(强调我的):
-I replstr
Insert mode: utility is executed for each line from standard input, taking the entire line as a single argument, inserting it in arguments for each occurrence of replstr.
这就是 GNU cp -t
扩展很有用的原因。它允许您将要复制的文件放在命令的末尾,这是 xargs
默认放置它们的位置,而不会将它们组合成一个参数。
echo "${folders_array[@]}" | xargs sudo cp -r -t /home/nebukadnexa/
请注意,如果任何文件名包含空格,则无法通过管道传输到 xargs
。