Command line 循环行的Shell命令?
最近,我经常发现自己想要在另一个命令的输出上运行某个命令,该命令的输出有好几行 例如,假设我有一个命令,该命令在新行上返回多个文件路径,并且我想删除所有这些文件Command line 循环行的Shell命令?,command-line,Command Line,最近,我经常发现自己想要在另一个命令的输出上运行某个命令,该命令的输出有好几行 例如,假设我有一个命令,该命令在新行上返回多个文件路径,并且我想删除所有这些文件 是否有一个命令可以帮助我执行此操作?在类似bash的shell中,您可以执行以下操作: rm `your command` 或 在类似bash的shell中,可以执行以下操作: rm `your command` 或 听起来你在找。从手册页: xargs从标准输入中读取参数,以空格(可以用双引号或单引号或反斜杠保护)或换行符分隔,并
是否有一个命令可以帮助我执行此操作?在类似bash的shell中,您可以执行以下操作:
rm `your command`
或
在类似bash的shell中,可以执行以下操作:
rm `your command`
或
听起来你在找。从手册页: xargs从标准输入中读取参数,以空格(可以用双引号或单引号或反斜杠保护)或换行符分隔,并使用任何初始参数和从标准输入读取的参数执行命令(默认为/bin/echo)一次或多次 因此,您可以执行以下操作:
ls | grep -v '*.cpp' | xargs rm
上面的命令将删除当前目录中除
*.cpp
文件以外的所有文件。听起来像是您要查找的文件。从手册页:
xargs从标准输入中读取参数,以空格(可以用双引号或单引号或反斜杠保护)或换行符分隔,并使用任何初始参数和从标准输入读取的参数执行命令(默认为/bin/echo)一次或多次
因此,您可以执行以下操作:
ls | grep -v '*.cpp' | xargs rm
上述命令将删除当前目录中除.cpp文件以外的所有文件。在Windows中,CMD:
for /f "usebackq delims=" %i in (`your command`) @del "%i"
Powershell:
your command | Remove-Item
在Windows中,CMD:
for /f "usebackq delims=" %i in (`your command`) @del "%i"
Powershell:
your command | Remove-Item
试一试
尽管您可能会遇到线条有空格的问题。我从来都不记得怎么解决这个问题。
请注意,此命令适用于逐行操作。使用xargs仅适用于您询问的示例案例(以及类似案例),但如果您可以使用xargs解决您的问题,一定要使用它。试试看
ls | xargs rm
尽管您可能会遇到线条有空格的问题。我从来都不记得怎么解决这个问题。
请注意,此命令适用于逐行操作。使用xargs仅适用于您询问的示例案例(以及类似案例),但是如果您可以使用xargs解决您的问题,那么一定要使用它
ls | xargs rm
一个有趣的用法(在目录中搜索文件中的短语)
这一点没有关系,但它显示了xargs是如何工作的
一个有趣的用法(在目录中搜索文件中的短语)
这一点不相关,但它显示了xargs如何工作,假设是一个类似UNIX的环境: 要处理名称中的空格,请使用xargs的
-0
标志。使用查找:
find . -name '*.mp3' -print0 | xargs -0 dosomething
其他一些命令具有用于nul分离输出的各种开关,通常是-0
或-z
。如果列表是面向行的,请执行以下操作:
cat filelist | tr -s '\012\015' '\000' | xargs -0 dosomething
它使用tr
将换行符和换行符转换为nuls,处理UNIX和DOS(甚至Mac Classic)行尾并跳过空行
不要忘记,在大多数类UNIX文件系统上,换行符是有效的文件名字符
如果dosomething
很复杂,可以使用bash函数:
dosomething() {
while [ -n "$1" ] ; do
out="$(basename "$1" .mp3).ogg"
convert "$1" "converted/$out"
shift
done
}
export -f dosomething
并调用xargs
如下:
cat filelist | tr -s '\012\015' '\000' | xargs -0 bash -c 'dosomething "$@"' --
请注意,明智地使用双引号保留空格,双引号字符串可以嵌套在双引号$()
eval运算符中
在函数中,您可以编写“$@”
,以获得正确引用的参数列表,并将其传递给子流程:
dosomething() {
command1 preargs "$@" postargs | command2
command3 "$@"
}
您还可以使用read
逐行工作:
cat filelist | while read i ; do something "$i" ; done
但是xargs可以一次获取所有参数。假设使用类似UNIX的环境: 要处理名称中的空格,请使用xargs的
-0
标志。使用查找:
find . -name '*.mp3' -print0 | xargs -0 dosomething
其他一些命令具有用于nul分离输出的各种开关,通常是-0
或-z
。如果列表是面向行的,请执行以下操作:
cat filelist | tr -s '\012\015' '\000' | xargs -0 dosomething
它使用tr
将换行符和换行符转换为nuls,处理UNIX和DOS(甚至Mac Classic)行尾并跳过空行
不要忘记,在大多数类UNIX文件系统上,换行符是有效的文件名字符
如果dosomething
很复杂,可以使用bash函数:
dosomething() {
while [ -n "$1" ] ; do
out="$(basename "$1" .mp3).ogg"
convert "$1" "converted/$out"
shift
done
}
export -f dosomething
并调用xargs
如下:
cat filelist | tr -s '\012\015' '\000' | xargs -0 bash -c 'dosomething "$@"' --
请注意,明智地使用双引号保留空格,双引号字符串可以嵌套在双引号$()
eval运算符中
在函数中,您可以编写“$@”
,以获得正确引用的参数列表,并将其传递给子流程:
dosomething() {
command1 preargs "$@" postargs | command2
command3 "$@"
}
您还可以使用read
逐行工作:
cat filelist | while read i ; do something "$i" ; done
但是xargs可以同时获取所有参数。什么环境?窗户?UNIX?什么环境?窗户?UNIX?在文件名包含空格或列表过长之前,此功能正常工作。在文件名包含空格或列表过长之前,此功能正常工作。您正在查找剪切。这将打印第一列。如果你想变得更时尚,请查看sed和/或awk。cat文件|读取i时;do FOO=echo$i | cut-f1;echo$FOO;完成(编辑:从回答移动到评论)您正在寻找剪切。这将打印第一列。如果你想变得更时尚,请查看sed和/或awk。cat文件|读取i时;do FOO=echo$i | cut-f1;echo$FOO;完成(编辑:从回答移动到评论)