2

我希望我的问题是有道理的。我对这些东西很陌生。

我正在使用这个管道命令来制作一个列表:

cat /etc/passwd | cut -d: -f7 |sort -n  |uniq  

输出是这样的:

/bin/bash   
/bin/false   
/bin/sync   
/no/shell  
/sbin/halt 
/sbin/nologin  
/sbin/shutdown 
/usr/sbin/nologin

我需要将此输出中的每一行放入此命令:

ls -l /bin/bash
ls -l /bin/false 
ls -l /bin/sync

然后我的输出如下所示:

-rwxr-xr-x. 1 root root 917576 11. bře  2013 /bin/bash   
-rwxr-xr-x. 1 root root  29920  8. kvě 09.45 /bin/false
-rwxr-xr-x. 1 root root  29940  8. kvě 09.45 /bin/sync

请帮助我执行此命令。

4

4 回答 4

2

xargs非常适合这种命令行工作。它在输入行上重复执行作为参数给出的命令。将您的输出输入xargs ls -l

cat /etc/passwd | cut -d: -f7 | sort -n | uniq | xargs ls -l
于 2013-10-29T22:42:24.137 回答
0

另一种方法:

echo ls -l `cat /etc/passwd | cut -d: -f7 | sort -n | uniq` | xargs

再次编辑以在末尾添加 xargs (我之前已经隔开),现在它给出了正确的输出,但它本质上是 uʍopǝpısdn 的答案重新工作。

@uʍop ǝpısdn 的回答效果很好。

于 2013-10-29T22:43:51.523 回答
0
while read; do ls -l $REPLY; done <<< "$(cat /etc/passwd|cut -d: -f7|sort -u)"
# or
cat /etc/passwd|cut -d: -f7|sort -u|while read; do ls -l $REPLY; done

但是,如果您只需要获取有关此文件的一些信息(例如权限),则stat在这种情况下更喜欢该命令。有关man stat更多详细信息,请参阅。请参阅此答案以了解如何在循环中读取命令输出。

注意:sort -u已经过滤了重复项;)

于 2013-10-29T23:02:41.597 回答
0

纯娱乐:

declare -A shell_you_re_nuts
while IFS=: read -r -a strawberry_fields; do
    shell_you_re_nuts[${strawberry_fields[6]}]=1
done < /etc/passwd
ls -l "${!shell_you_re_nuts[@]}"

为什么?因为我将 bash 的散列功能用于唯一部分,然后ls足够聪明地为我进行排序。

只是为了好玩(再次):

ls -l $( (IFS=$':\n'; printf '%.0s%.0s%0.s%0.s%0.s%.0s%s\n' $(</etc/passwd) ) | sort -u)
于 2013-10-29T23:34:40.963 回答