例如,现在我正在使用以下命令来更改几个文件,这些文件的Unix路径是我写到一个文件中的:

cat file.txt | while read in; do chmod 755 "$in"; done

有没有更优雅、更安全的方式?


当前回答

如果你知道你在输入中没有任何空白:

xargs chmod 755 < file.txt

如果路径中可能有空格,如果你有GNU xargs:

tr '\n' '\0' < file.txt | xargs -0 chmod 755

其他回答

如果你知道你在输入中没有任何空白:

xargs chmod 755 < file.txt

如果路径中可能有空格,如果你有GNU xargs:

tr '\n' '\0' < file.txt | xargs -0 chmod 755

这一逻辑也适用于许多其他目标。 如何从/home/文件系统中读取每个用户的.sh_history ?如果有上千个呢?

#!/bin/ksh
last |head -10|awk '{print $1}'|
 while IFS= read -r line
 do
su - "$line" -c 'tail .sh_history'
 done

下面是脚本https://github.com/imvieira/SysAdmin_DevOps_Scripts/blob/master/get_and_run.sh

我看到你标记了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

您还可以使用AWK,它可以为您提供更大的灵活性来处理文件

awk '{ print "chmod 755 "$0"" | "/bin/sh"}' file.txt

如果你的文件有一个字段分隔符:

字段 1,字段 2,字段 3

只得到第一个字段

awk -F, '{ print "chmod 755 "$1"" | "/bin/sh"}' file.txt

你可以在GNU文档中查看更多细节 https://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html#Very-Simple

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

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