grep 之后的 mobaXterm 复制

mobaXterm copy after grep

提问人:erazmus 提问时间:11/10/2023 最后编辑:erazmus 更新时间:11/14/2023 访问量:55

问:

我正在做

grep -l 0000201290 ServerApplication.log* | xargs cp  j231110_4/

但它告诉我

cp: can't stat 'ServerApplication.log.5/j231110_4': Not a directory

哪个是正确的,它应该是“j231110_4/ServerApplication.log.5”,因为“j231110_4”是一个目录,而“ServerApplication.log.5”是我想复制到目录“j231110_4”中的文件。

如何将grep输出文件列表复制到某个目录?

试过如何将输出从 grep 管道传输到 cp? 但它不起作用。 我想 mobaXterm 的工作方式与 linux 不同。

grep cp mobaxterm

评论


答:

1赞 Paul Hodges 11/13/2023 #1

你的论点以错误的顺序结束。使用 xargs 的 -I 作为占位符。

grep -l 0000201290 ServerApplication.log* | xargs -I@ cp "@" j231110_4/

只要替换字符串不显示在命令中的其他任何位置,这是非常宽容的。

$: echo 1 2 3 | xargs -Ibar echo "cp 'bar' foo/"
cp '1 2 3' foo/

$: rm -fr foo/; mkdir -p foo/; touch '1 2 3'; echo 1 2 3 | xargs -Ibar cp 'bar' foo/; ls -l foo/
total 0
-rw-r--r-- 1 P2759474 1049089 0 Nov 13 08:50 '1 2 3'

啊,BusyBox......

我明白了 . . .xargs: unknown option -- I BusyBox v1.22.1 (2015-11-10 11:07:12 ) multi-call binary.

然后试试这个:使用 的选项使参数顺序无关紧要。cp-t

grep -l 0000201290 ServerApplication.log* | xargs cp -t j231110_4/

只要您的文件名中没有任何奇怪的字符(例如嵌入空格),它就应该有效 - 看起来很有可能,但我尽量少做假设。我在 HackerRank BusyBox v1.36.1 上进行了快速测试,所以希望 v1.22.1 会尊重 .-t

如果你确实有奇怪的角色......试试这个。

mapfile -t lst < <( grep -l 0000201290 ServerApplication.log* )
cp -t j231110_4/ "${lst[@]}"

如果由于某种原因这些都不起作用,请回退到最简单的:

grep -l 0000201290 ServerApplication.log* |
  while read -r file; do cp "$file" j231110_4/; done

这在嵌入的换行符上仍然会失败,因此请检查您的数据。

或者(同样,只要没有嵌入的惊喜)只是

cp $(grep -l 0000201290 ServerApplication.log*) j231110_4/
  • 但请注意为什么您使用的版本通常不安全。“方便”的语法并不总是最好的主意。

评论

0赞 erazmus 11/13/2023
然后我得到xargs: unknown option -- I
0赞 Paul Hodges 11/13/2023
对于之前的简短回答和重复的帖子,我们深表歉意。我的手机行为不正常。此示例是否清除了问题?
0赞 erazmus 11/14/2023
我得到xargs: unknown option -- I BusyBox v1.22.1 (2015-11-10 11:07:12 ) multi-call binary. Usage: xargs [OPTIONS] [PROG ARGS] Run PROG on every item given by stdin -p Ask user whether to run each command -r Don't run command if input is empty -0 Input is separated by NUL characters -t Print the command on stderr before execution -e[STR] STR stops input processing -n N Pass no more than N args to PROG -s N Pass command line of no more than N bytes -x Exit if size is exceeded
0赞 erazmus 11/15/2023
得到了,但是......终于奏效了。伟大!谢谢!cp: unknown option -- twhile read