例如,现在我正在使用以下内容来更改我写入文件的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)
d.r*_*aev 14
如果你有一个漂亮的选择器(例如dir中的所有.txt文件)你可以这样做:
for i in *.txt; do chmod 755 "$i"; done
Run Code Online (Sandbox Code Playgroud)
或者你的变种:
while read line; do chmod 755 "$line"; done <file.txt
Run Code Online (Sandbox Code Playgroud)
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
如今(在 GNU Linux 中)xargs仍然是这个问题的答案,但是......您现在可以使用该-a选项直接从文件读取输入:
xargs -a file.txt -n 1 -I {} chmod 775 {}
您还可以使用 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