例如,现在我正在使用以下命令来更改几个文件,这些文件的Unix路径是我写到一个文件中的:
cat file.txt | while read in; do chmod 755 "$in"; done
有没有更优雅、更安全的方式?
例如,现在我正在使用以下命令来更改几个文件,这些文件的Unix路径是我写到一个文件中的:
cat file.txt | while read in; do chmod 755 "$in"; done
有没有更优雅、更安全的方式?
当前回答
如果你有一个很好的选择器(例如所有的。txt文件都在一个目录下) 你可以这样做:
for i in *.txt; do chmod 755 "$i"; done
Bash for循环
或者是你的变种:
while read line; do chmod 755 "$line"; done < file.txt
其他回答
如果你知道你在输入中没有任何空白:
xargs chmod 755 < file.txt
如果路径中可能有空格,如果你有GNU xargs:
tr '\n' '\0' < file.txt | xargs -0 chmod 755
如果你有一个很好的选择器(例如所有的。txt文件都在一个目录下) 你可以这样做:
for i in *.txt; do chmod 755 "$i"; done
Bash for循环
或者是你的变种:
while read line; do chmod 755 "$line"; done < file.txt
现在(在GNU Linux中)xargs仍然是这个问题的答案,但是…你现在可以使用-a选项直接从文件中读取输入:
xargs -a file.txt -n 1 -I {} chmod 775 {}
如果您想为每一行并行运行命令,可以使用GNU parallel
parallel -a <your file> <program>
文件的每一行都将作为参数传递给程序。默认情况下,并行运行与cpu数量相同的线程。但是你可以用-j来指定它
我看到你标记了bash,但Perl也是一种很好的方式:
perl -p -e '`chmod 755 $_`' file.txt
你也可以应用一个regex来确保你得到了正确的文件,例如只处理。txt文件:
perl -p -e 'if(/\.txt$/) `chmod 755 $_`' file.txt
要“预览”正在发生的事情,只需将反撇号替换为双引号并预打印:
perl -p -e 'if(/\.txt$/) print "chmod 755 $_"' file.txt