如何为文件的每一行运行命令?

haw*_*awk 135 bash loops line

例如,现在我正在使用以下内容来更改我写入文件的Unix路径的几个文件:

cat file.txt | while read in; do chmod 755 "$in"; done
Run Code Online (Sandbox Code Playgroud)

有更优雅,更安全的方式吗?

P.P*_*.P. 143

是.

while read in; do chmod 755 "$in"; done < file.txt
Run Code Online (Sandbox Code Playgroud)

这样就可以避免cat进程.

cat对于像这样的目的来说几乎总是不好的.您可以阅读有关Catless Use of Cat的更多信息.


F. *_*uri 99

如果您的文件不是太大而且所有文件都命名良好(没有空格或其他特殊字符,如引号),您可以简单地:

chmod 755 $(<file.txt)
Run Code Online (Sandbox Code Playgroud)

如果你有特殊的字符和/或很多行shell.

xargs chmod 755 <file.txt
Run Code Online (Sandbox Code Playgroud)

如果您的命令需要通过条目正好运行一次:

xargs -0 chmod 755 < <(tr \\n \\0 <file.txt)
Run Code Online (Sandbox Code Playgroud)

这个示例不需要这样做,因为xargs接受多个文件作为参数,但这与问题的标题相匹配.

对于某些特殊情况,您甚至可以在生成的命令中定义文件参数的位置while read:

xargs -0 -n 1 chmod 755 < <(tr \\n \\0 <file.txt)
Run Code Online (Sandbox Code Playgroud)

  • 由于`xargs`最初是为了满足这种需求而构建的,所以有些功能,比如*在当前环境中尽可能长地构建命令*,在这种情况下尽可能少地调用`chmod`,减少*forks*确保效率.`while; do..done <$ file` implie为1个文件运行1个fork.`xargs`可以以可靠的方式为千个文件运行1个fork. (3认同)
  • 这似乎与Makefile特定语法相关联.您可以尝试反转命令行:`cat file.txt | tr \\n \\ 0 | xargs -0 -n1 chmod 755` (2认同)

d.r*_*aev 14

如果你有一个漂亮的选择器(例如dir中的所有.txt文件)你可以这样做:

for i in *.txt; do chmod 755 "$i"; done
Run Code Online (Sandbox Code Playgroud)

bash for loop

或者你的变种:

while read line; do chmod 755 "$line"; done <file.txt
Run Code Online (Sandbox Code Playgroud)

  • 不起作用的是,如果行中有空格,输入将按空格而不是按行分隔。 (2认同)

gle*_*man 13

如果您知道输入中没有任何空格:

xargs chmod 755 < file.txt
Run Code Online (Sandbox Code Playgroud)

如果路径中可能有空格,并且您有GNU xargs:

tr '\n' '\0' < file.txt | xargs -0 chmod 755
Run Code Online (Sandbox Code Playgroud)


jan*_*isz 11

如果要为每一行并行运行命令,可以使用GNU Parallel

parallel -a <your file> <program>
Run Code Online (Sandbox Code Playgroud)

文件的每一行都将作为参数传递给程序.默认情况下,parallel运行与CPU计数一样多的线程.但你可以指定它-j


Ray*_*nda 6

如今(在 GNU Linux 中)xargs仍然是这个问题的答案,但是......您现在可以使用该-a选项直接从文件读取输入:

xargs -a file.txt -n 1 -I {} chmod 775 {}


bru*_*crt 5

您还可以使用 AWK,它可以让您更灵活地处理文件

awk '{ print "chmod 755 "$0"" | "/bin/sh"}' file.txt
Run Code Online (Sandbox Code Playgroud)

如果您的文件有一个字段分隔符,例如:

字段 1,字段 2,字段 3

仅获取您执行的第一个字段

awk -F, '{ print "chmod 755 "$1"" | "/bin/sh"}' file.txt
Run Code Online (Sandbox Code Playgroud)

您可以在 GNU 文档上查看更多详细信息 https://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html#Very-Simple