我知道该grep
命令并且正在了解 的功能xargs
,因此我通读了此页面,其中提供了一些有关如何使用该xargs
命令的示例。
我对最后一个示例感到困惑,示例 10。它说“xargs 命令执行 grep 命令以查找包含字符串 'stdlib.h' 的所有文件(在 find 命令提供的文件中)”
$ find . -name '*.c' | xargs grep 'stdlib.h'
./tgsthreads.c:#include
./valgrind.c:#include
./direntry.c:#include
./xvirus.c:#include
./temp.c:#include
...
...
...
Run Code Online (Sandbox Code Playgroud)
但是,简单地使用有什么区别
$ find . -name '*.c' | grep 'stdlib.h'
Run Code Online (Sandbox Code Playgroud)
?
显然,我仍在为 xargs 正在做什么而苦苦挣扎,因此感谢您提供任何帮助!
通常要删除文件名中带有空格的文件,您必须运行:
$ rm "file name"
Run Code Online (Sandbox Code Playgroud)
但如果我想删除多个文件,例如:
$ find . -name "*.txt" | xargs rm
Run Code Online (Sandbox Code Playgroud)
这不会删除其中包含空格的文件。
在许多情况下,我使用命令替换而不是xargs
. 例如rm $(ls)
与ls | xargs rm
它们之间的真正区别是什么?
我认为差异之一是命令替换在子shell中xargs
运行,而在当前shell中运行,但我不确定。
请列出差异。
为什么 xargs 不能删除名称中带有空格的目录,以及如何解决这个问题?
76 find . -type d |xargs rm -rf
77 rm -rf fire\ hydrant/
78 rm -rf wine\ glass/
79 rm -rf tennis\ racket/
80 rm -rf traffic\ light/
81 rm -rf parking\ meter/
82 rm -rf teddy\ bear/
83 rm -rf sports\ ball/
84 rm -rf cell\ phone/
85 rm -rf stop\ sign/
86 rm -rf dining\ table/
87 rm -rf potted\ plant/
Run Code Online (Sandbox Code Playgroud) 我想用命令计算主目录上的所有普通文件:
$ find ~ -type f | xargs echo | wc -w
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
Run Code Online (Sandbox Code Playgroud)
它提示
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
Run Code Online (Sandbox Code Playgroud)
使用上有什么问题?
我有一个包含名称 ( nameslist.txt
)的文本文件,我想使用它们读取它们cat
并将结果通过管道xargs
传递给grep
命令,以便grep
检查它在目标文件 ( targetfile.txt
) 中接收到的每个名称是否存在。
假设targetfile.txt
包含大量名称,其中一些名称可能包含在nameslist.txt
.
我应该怎么之间添加xargs
和grep
之间,以及grep
与./targetfile.txt
下面?
cat ./nameslist.txt | xargs grep ./targetfile.txt
Run Code Online (Sandbox Code Playgroud)
谢谢
为了notify-osd
在 Linux (Ubuntu) 上拦截 ( ) 通知,我使用了dbus-monitor
下面的脚本。随后,脚本运行另一个脚本 ( /opt/nonotifs/nonotifs/silent
),并将截获的通知作为参数,以进行进一步处理:
#!/bin/bash
dbus-monitor "interface='org.freedesktop.Notifications'" | \
grep --line-buffered "string" | \
grep --line-buffered -e method -e ":" -e '""' -e urgency -e notify -v | \
grep --line-buffered '.*(?=string)|(?<=string).*' -oPi | \
grep --line-buffered -v '^\s*$' | \
xargs -I '{}' /opt/nonotifs/nonotifs/silent {}
Run Code Online (Sandbox Code Playgroud)
这完美无缺,除了通知hplip
。
从终端运行时,上面的脚本显示:
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
Run Code Online (Sandbox Code Playgroud)
-0 …
尝试学习 Bash 脚本我想对当前目录下满足特定条件的所有文件执行一些命令。使用
find -name *.flac
Run Code Online (Sandbox Code Playgroud)
具体来说,我想转换.flac
为.mp3
. 我可以找到所有文件。但是,我没有看到使用-exec
forfind
和 using选项执行命令的区别xargs
。例如
find -name *.flac | xargs -i ffmpeg -i {} {}.mp3
Run Code Online (Sandbox Code Playgroud)
相比
find -name *.flac -exec ffmpeg -i {} {}.mp3 \;
Run Code Online (Sandbox Code Playgroud)
有人可以指出区别吗?什么是更好的实践?有什么优点/缺点?
另外:如果我想同时删除原始文件,我将如何在上面的代码中添加第二个命令?
PreTabs.txt
是我桌面上的一个文件,它只包含该行
google.com
Run Code Online (Sandbox Code Playgroud)
我想将该文件的内容通过管道传输到 Firefox,以便它会在新选项卡中打开 URL。
如果你执行cat PreTabs.txt | firefox
,那
不应该和firefox [Contents of PreTabs.txt]
?
我想通过添加子目录的名称来重命名每个子目录中的文件。按照通过添加父文件夹名称来重命名文件的答案,我尝试了:
rename 's/(.*)\//$1\/$1_/' */*
Run Code Online (Sandbox Code Playgroud)
但是,对于许多子目录,它不起作用。我有 13,000 个子目录,每个子目录包含大约 300 个文件。我得到
-bash: /usr/bin/rename: Argument list too long
Run Code Online (Sandbox Code Playgroud)
我试过:
ls | xargs rename 's/(.*)\//$1\/$1_/' */*
find . -maxdepth 1 -type f -print0 | xargs rename 's/(.*)\//$1\/$1_/' */*
Run Code Online (Sandbox Code Playgroud)
两者都给出相同的错误:
-bash: /usr/bin/xargs: Argument list too long
Run Code Online (Sandbox Code Playgroud)
编辑
xargs -L rename 's/(.*)\//$1\/$1_/' */*
xargs -L1 rename 's/(.*)\//$1\/$1_/' */*
Run Code Online (Sandbox Code Playgroud)
同样的错误:
-bash: /usr/bin/xargs: Argument list too long
Run Code Online (Sandbox Code Playgroud)