提问人:erazmus 提问时间:11/10/2023 最后编辑:erazmus 更新时间:11/14/2023 访问量:55
grep 之后的 mobaXterm 复制
mobaXterm copy after grep
问:
我正在做
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 不同。
答:
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 -- t
while read
评论