在列出目录时,是否可以查看数字Unix权限,如644,而不是符号输出-rw-rw-r——?
谢谢。
在列出目录时,是否可以查看数字Unix权限,如644,而不是符号输出-rw-rw-r——?
谢谢。
当前回答
在阅读了这里的许多答案后,按照评论中提供的链接回到了最初的UNIX方法,在想要结合这里提供的内容以及我已经学到的技巧和技巧的同时,我提出了一个新的解决方案。
首先,我曾经使用这个别名,给我列标题:
alias l='echo "Dir Size|Perms|Link Count|Owner|Group|Size|Mod. Time|Name"; ls -haFl --time-style=long-iso --color=always --group-directories-first --format=long'
在将此与AWK结合后,我首先了解到我必须更改AWK命令,当使用ls的“-s”选项时,因为这显示了第一列的大小,然后需要读取和解析第二列数据(不再是第一列)。
我发现的问题是,当你提供输入“l”,即,你在一个路径,并键入:l,很好,但如果你键入“l”然后一个目录名怎么办?如果要列出子目录中的所有内容,该怎么办?这是不可能发生的,因为别名不处理输入。我可以用一个函数来处理这个。然后AWk崩溃了,我可以用一个子别名来处理。
两者的结合非常完美。
添加到我的。bashrc文件
function _bestLS() {
echo 'MODE|Dir Size|Perms|Link Count|Owner|Group|Size|Mod. Time|Name';
if [ "$*" == '' ]; then
alias _awk4ls="awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$2,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'";
output=`ls -shaFl --time-style=long-iso --color=always -F --group-directories-first --format=long | _awk4ls`;
else
output=`ls -shaFl --time-style=long-iso --color=always -F --group-directories-first --format=long $* | _awk4ls`;
fi
echo "$output"
}
alias l="_bestLS"
观察(请注意,这是一个小写字母L,而不是数字1,在这个网站的字体看起来是一样的):
>>l
>>l [SOME DIRECTORY]
附注:请原谅我很长的(3行)提示(PS1)
其他回答
在阅读了这里的许多答案后,按照评论中提供的链接回到了最初的UNIX方法,在想要结合这里提供的内容以及我已经学到的技巧和技巧的同时,我提出了一个新的解决方案。
首先,我曾经使用这个别名,给我列标题:
alias l='echo "Dir Size|Perms|Link Count|Owner|Group|Size|Mod. Time|Name"; ls -haFl --time-style=long-iso --color=always --group-directories-first --format=long'
在将此与AWK结合后,我首先了解到我必须更改AWK命令,当使用ls的“-s”选项时,因为这显示了第一列的大小,然后需要读取和解析第二列数据(不再是第一列)。
我发现的问题是,当你提供输入“l”,即,你在一个路径,并键入:l,很好,但如果你键入“l”然后一个目录名怎么办?如果要列出子目录中的所有内容,该怎么办?这是不可能发生的,因为别名不处理输入。我可以用一个函数来处理这个。然后AWk崩溃了,我可以用一个子别名来处理。
两者的结合非常完美。
添加到我的。bashrc文件
function _bestLS() {
echo 'MODE|Dir Size|Perms|Link Count|Owner|Group|Size|Mod. Time|Name';
if [ "$*" == '' ]; then
alias _awk4ls="awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$2,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'";
output=`ls -shaFl --time-style=long-iso --color=always -F --group-directories-first --format=long | _awk4ls`;
else
output=`ls -shaFl --time-style=long-iso --color=always -F --group-directories-first --format=long $* | _awk4ls`;
fi
echo "$output"
}
alias l="_bestLS"
观察(请注意,这是一个小写字母L,而不是数字1,在这个网站的字体看起来是一样的):
>>l
>>l [SOME DIRECTORY]
附注:请原谅我很长的(3行)提示(PS1)
@The 我卖
哇,漂亮的awk!但是suid, sgid和sticky bit呢?
你必须用s和t扩展你的过滤器,否则它们就不算数,你会得到错误的结果。要计算这个特殊标志的八进制数,程序是相同的,但是索引是4 7和10。有执行位设置的文件可能的标志是——s——s——t,没有执行位设置的文件可能的标志是——s——s——t
ls -l | awk '{
k = 0
s = 0
for( i = 0; i <= 8; i++ )
{
k += ( ( substr( $1, i+2, 1 ) ~ /[rwxst]/ ) * 2 ^( 8 - i ) )
}
j = 4
for( i = 4; i <= 10; i += 3 )
{
s += ( ( substr( $1, i, 1 ) ~ /[stST]/ ) * j )
j/=2
}
if ( k )
{
printf( "%0o%0o ", s, k )
}
print
}'
为测试:
touch blah
chmod 7444 blah
会导致:
7444 -r-Sr-Sr-T 1 cheko cheko 0 2009-12-05 01:03 blah
and
touch blah
chmod 7555 blah
将:
7555 -r-sr-sr-t 1 cheko cheko 0 2009-12-05 01:03 blah
我能想到的最接近的方法(保持简单)是stat,假设您知道要查找哪些文件。如果你没有,*可以找到大部分:
/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...
它处理粘性,suid和公司的盒子:
$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
根据选择的答案和使用别名的建议,我将其转换为一个函数,以便将目录传递给list。
# ls, with chmod-like permissions and more.
# @param $1 The directory to ls
function lls {
LLS_PATH=$1
ls -AHl $LLS_PATH | awk "{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/) \
*2^(8-i));if(k)printf(\"%0o \",k);print}"
}
您不使用ls来获取文件的权限信息。使用stat命令。它会给你你想要的数值。“Unix方式”说的是,你应该使用ls(或'echo *')、stat和其他任何你喜欢的东西来创建你自己的脚本,以你想要的格式提供信息。