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;完成(编辑:从回答移动到评论)