Linux 是否有办法查看路径的所有中间目录的权限。。?
我有一个文件路径。。是否有任何一个命令可以查看路径中所有中间目录的文件/目录权限?我知道有一个这样的命令,但它已经有近30年的历史了,尽管它仍然可以正常工作。它应该用sh或perl重写,但这是可行的:Linux 是否有办法查看路径的所有中间目录的权限。。?,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我有一个文件路径。。是否有任何一个命令可以查看路径中所有中间目录的文件/目录权限?我知道有一个这样的命令,但它已经有近30年的历史了,尽管它仍然可以正常工作。它应该用sh或perl重写,但这是可行的: #!/bin/csh -f # pup - print all dir perms from here up to root if ( $#argv == 0 ) then set args = ( $cwd ) else set args = ( $argv )
#!/bin/csh -f
# pup - print all dir perms from here up to root
if ( $#argv == 0 ) then
set args = ( $cwd )
else
set args = ( $argv )
endif
@ mult = ( $#argv > 1 )
foreach dir ( $args )
if ( $mult ) echo "${dir}:"
loop:
if ( "$dir" == '' ) set dir = '/'
ls -lLd "$dir"
if ( "$dir" == '/' ) goto next_for
set dir = ( `echo "$dir" | sed 's;/[^/]*$;;'` )
goto loop
next_for:
end
下面是一个运行它的示例:
% pup /usr/src/usr.bin/vi/vi
drwxr-xr-x 3 root wsrc 1024 May 29 2008 /usr/src/usr.bin/vi/vi
drwxr-xr-x 13 root wsrc 512 Aug 7 2008 /usr/src/usr.bin/vi
drwxr-xr-x 229 root wsrc 4096 Aug 7 2008 /usr/src/usr.bin
drwxrwxr-x 18 root wsrc 512 Aug 7 2008 /usr/src
drwxr-xr-x 22 root wheel 512 Jan 28 2010 /usr
drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
它默认为cwd。是的,输出不太好。如果我今天早上有动力,也许我会重写它
编辑 这里有一个使用您的系统
ls
程序的重写。它在处理符号链接方面具有优势:
#!/usr/bin/env perl
use strict;
use warnings;
use Cwd qw( getcwd abs_path );
use File::Basename qw( dirname );
sub ls { 0 == system("ls", "-lid", @_) }
@ARGV = getcwd() unless @ARGV;
for my $path (@ARGV) {
if (-l $path) {
ls($path);
$path = abs_path($path);
}
while (ls($path) && $path !~ m{ \A /+ \z }x) {
$path = dirname(abs_path($path));
}
}
exit;
但是我真的很讨厌ls
格式化东西的方式。例如:
chthon(tchrist)% pup1 /dev/null /dev/zero /dev/tty /dev/stdin /dev/fd/0 ~ Mail
79283 crw-rw-rw- 1 root wheel 2, 2 Nov 7 07:53 /dev/null
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79284 crw-rw-rw- 1 root wheel 2, 12 Oct 25 2008 /dev/zero
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79280 crw-rw-rw- 1 root wheel 1, 0 Nov 4 15:17 /dev/tty
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79285 crw-rw-rw- 1 root wheel 22, 0 Oct 25 2008 /dev/stdin
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79308 crw-rw-rw- 1 root wheel 22, 0 Oct 25 2008 /dev/fd/0
77954 dr-xr-xr-x 2 root wheel 1024 Oct 25 2008 /dev/fd
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
1143296 drwxr-xr-x 197 tchrist wheel 48128 Nov 7 07:53 /home/tchrist
2 drwxr-xr-x 15 root wheel 512 Aug 12 2008 /home
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
1146538 lrwx------ 1 root wheel 5 Oct 23 2008 Mail -> /mail
2 drwxr-xr-x 134 tchrist wheel 5120 Nov 7 07:43 /mail
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
chthon(tchrist)% pup2 /dev/null /dev/zero /dev/tty /dev/stdin /dev/fd/0 ~ Mail
79283 crw-rw-rw- 1 root wheel 2, 2 2011-11-07 07:34:47 /dev/null
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79284 crw-rw-rw- 1 root wheel 2, 12 2008-10-25 08:03:50 /dev/zero
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79280 crw-rw-rw- 1 root wheel 1, 0 2011-11-04 15:17:35 /dev/tty
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79285 crw-rw-rw- 1 root wheel 22, 0 2008-10-25 08:03:50 /dev/stdin
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79308 crw-rw-rw- 1 root wheel 22, 0 2008-10-25 08:03:51 /dev/fd/0
77954 dr-xr-xr-x 2 root wheel 1024 2008-10-25 08:03:51 /dev/fd
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
1143296 drwxr-xr-x 197 tchrist wheel 48128 2011-11-07 04:16:49 .
2 drwxr-xr-x 15 root wheel 512 2008-08-12 16:51:23 /home
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
1146538 lrwx------ 1 root wheel 5 2008-10-23 14:50:24 Mail -> /mail
2 drwxr-xr-x 134 tchrist wheel 5120 2011-11-07 07:43:59 /mail
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
明白我的意思吗?这里有一个完全内置的
自从我从find2perl
偷取了ls例程以来,我花了很长时间才找到主要/次要宏。除了我测试的系统外,它可能无法在其他系统上正确执行这些操作
#!/usr/bin/env perl
use strict;
use warnings;
my $USE_SHELL_LS_PROGRAM = 0;
use Cwd qw( getcwd abs_path );
use File::Basename qw( dirname );
@ARGV = getcwd() unless @ARGV;
*ls = $USE_SHELL_LS_PROGRAM ? \&your_ls : \&my_ls;
for my $path (@ARGV) {
if (-l $path) {
ls($path);
$path = abs_path($path);
}
while (ls($path) && $path !~ m{ \A /+ \z }x) {
$path = dirname(abs_path($path));
}
}
exit;
########
sub your_ls {
0 == system("ls", "-lid", @_);
}
sub my_ls {
use POSIX qw( strftime );
my $name = shift();
my @rwx = qw(--- --x -w- -wx r-- r-x rw- rwx);
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = CORE::lstat($name)
or do {
printf STDERR "$0: cannot lstat $name: $!\n";
return 0;
};
my $pname = $name;
$blocks
or $blocks = int(($size + 1023) / 1024);
my $perms = $rwx[$mode & 7];
$mode >>= 3;
$perms = $rwx[$mode & 7] . $perms;
$mode >>= 3;
$perms = $rwx[$mode & 7] . $perms;
substr($perms, 2, 1) =~ tr/-x/Ss/ if -u _;
substr($perms, 5, 1) =~ tr/-x/Ss/ if -g _;
substr($perms, 8, 1) =~ tr/-x/Tt/ if -k _;
if (-f _) { $perms = '-' . $perms; }
elsif (-d _) { $perms = 'd' . $perms; }
elsif (-l _) { $perms = 'l' . $perms; $pname .= ' -> ' . readlink($name); }
elsif (-c _) { $perms = 'c' . $perms; $size = sizemm($rdev); }
elsif (-b _) { $perms = 'b' . $perms; $size = sizemm($rdev); }
elsif (-p _) { $perms = 'p' . $perms; }
elsif (-S _) { $perms = 's' . $perms; }
else { $perms = '?' . $perms; }
printf "%9u %-10s %4d %-8s %-8s %8s %s %s\n",
$ino,
$perms,
$nlink,
user($uid),
group($gid),
$size,
strftime("%F %T", localtime $mtime),
$pname;
return 1;
}
sub sizemm {
my $dev = shift;
# these are almost always wrong:
my $major = ($dev >> 8) & 0xff;
my $minor = $dev & 0xff;
# now fix the ones we know how to
for ($^O) {
if (/openbsd/) {
$major = ($dev >> 8) & 0xff;
$minor = ($dev & 0xff) | (($dev & 0xffff0000) >> 8);
}
if (/darwin/) {
$major = ($dev >> 24) & 0xff;
$minor = $dev & 0xffffff;
}
if (/solaris/) {
$major = ($dev >> 18) & 0x3fff;
$minor = $dev & 0x3ffff;
}
if (/linux/) {
$major = (($dev >> 8) & 0xfff) | (($dev >> 32) & ~0xfff);
$minor = ($dev & 0xff) | (($dev >> 12) & ~0xff);
}
}
return sprintf("%3d, %3d", $major, $minor);
}
# cache user number to name conversions
sub user {
use User::pwent;
my $uid = shift;
our %user;
$user{$uid} = getpwuid($uid)->name || "#$uid"
unless defined $user{$uid};
return $user{$uid};
}
# cache group number to name conversions
sub group {
use User::grent;
my $gid = shift;
our %group;
$group{$gid} = getgrgid($gid)->name || "#$gid"
unless defined $group{$gid};
return $group{$gid};
}
例如:
chthon(tchrist)% pup1 /dev/null /dev/zero /dev/tty /dev/stdin /dev/fd/0 ~ Mail
79283 crw-rw-rw- 1 root wheel 2, 2 Nov 7 07:53 /dev/null
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79284 crw-rw-rw- 1 root wheel 2, 12 Oct 25 2008 /dev/zero
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79280 crw-rw-rw- 1 root wheel 1, 0 Nov 4 15:17 /dev/tty
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79285 crw-rw-rw- 1 root wheel 22, 0 Oct 25 2008 /dev/stdin
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
79308 crw-rw-rw- 1 root wheel 22, 0 Oct 25 2008 /dev/fd/0
77954 dr-xr-xr-x 2 root wheel 1024 Oct 25 2008 /dev/fd
77953 drwxr-xr-x 3 root wheel 22016 Oct 17 21:15 /dev
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
1143296 drwxr-xr-x 197 tchrist wheel 48128 Nov 7 07:53 /home/tchrist
2 drwxr-xr-x 15 root wheel 512 Aug 12 2008 /home
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
1146538 lrwx------ 1 root wheel 5 Oct 23 2008 Mail -> /mail
2 drwxr-xr-x 134 tchrist wheel 5120 Nov 7 07:43 /mail
2 drwxr-xr-x 21 root wheel 1024 Aug 23 2010 /
chthon(tchrist)% pup2 /dev/null /dev/zero /dev/tty /dev/stdin /dev/fd/0 ~ Mail
79283 crw-rw-rw- 1 root wheel 2, 2 2011-11-07 07:34:47 /dev/null
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79284 crw-rw-rw- 1 root wheel 2, 12 2008-10-25 08:03:50 /dev/zero
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79280 crw-rw-rw- 1 root wheel 1, 0 2011-11-04 15:17:35 /dev/tty
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79285 crw-rw-rw- 1 root wheel 22, 0 2008-10-25 08:03:50 /dev/stdin
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
79308 crw-rw-rw- 1 root wheel 22, 0 2008-10-25 08:03:51 /dev/fd/0
77954 dr-xr-xr-x 2 root wheel 1024 2008-10-25 08:03:51 /dev/fd
77953 drwxr-xr-x 3 root wheel 22016 2011-10-17 21:15:55 /dev
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
1143296 drwxr-xr-x 197 tchrist wheel 48128 2011-11-07 04:16:49 .
2 drwxr-xr-x 15 root wheel 512 2008-08-12 16:51:23 /home
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
1146538 lrwx------ 1 root wheel 5 2008-10-23 14:50:24 Mail -> /mail
2 drwxr-xr-x 134 tchrist wheel 5120 2011-11-07 07:43:59 /mail
2 drwxr-xr-x 21 root wheel 1024 2010-08-23 11:43:46 /
您可以运行以下代码:
lsd() { local v="$1"; while :; do v="${v%/*}"; [[ "$v" && ! -f "$v" ]] || break; ls -ld "$v"; done; }
lsd /usr/share/doc/acl/README
drwxr-xr-x 2 root root 4096 14 mai 12:28 /usr/share/doc/acl/
drwxr-xr-x 145 root root 4096 4 nov. 06:23 /usr/share/doc/
drwxr-xr-x 263 root root 12288 4 nov. 06:23 /usr/share/
drwxr-xr-x 14 root root 4096 28 oct. 22:47 /usr/
编辑:添加了本地关键字
Edit2:最后一项错误已解决这里是一个简单的while循环,用于执行此任务:
f="$PWD"
while [ "$f" != "/" ]
do
ls -ld "$f"
f=$(dirname "$f")
done
ls-l/path不起作用?在这里,我只是为您重写了它(两次)。这应该会更好。在Linux上有一些奇怪的东西,你可以发现自己是“/”的根。不过,我不记得它是如何工作的。@tchrist:AFAIK没有人在任何当前的Unix上使用它,所以它只是被当作/。在这种情况下,我认为列出/两次或列出//一次都是可以接受的。这就是说,//for/的任何使用可能都不是未来的证明。我一点也不喜欢camelCase名称,我也不喜欢它重置全局变量的方式,但对于oneliner
sh
magic,@larsmans确实,该命令违反了shell命令名的v7规则,在该规则中,它们都是小写的,并且输入非常短,至少8个字符。我能很快想到的唯一例外是MAKEDEV
。您可以输入您想要的名称,它不是预先定义的;)对于全局,您可以将本地添加到循环…-1上一次迭代总是抛出错误:ls::没有这样的文件或目录
,因为v
为空。您还必须确保将/添加到最后一个目录,否则它将丢失。e、 g.getPermForDirs/var/tmp
打印drwxr-xr-x 40 root 4096 Nov 6 05:09/var/ls::没有这样的文件或目录
很酷,但是使用“`readlink-f$1`”
而不是简单的“$1”
不是很好吗?然后您就可以使用give来指定文件名是否有路径。为什么它被称为pup
?类比于dd
?这很讽刺。一个人看到这一点的第一反应是发布一个链接(是否有更规范的链接?)。我承认有些惊讶,这是由tchrist发布的@威廉珀塞尔:就像已经告诉我了一样(这本书写于1983年,当时我还没有开始反对csh的圣战。我看到其中至少有一个bug,因为它没有引用backtick任务。我认为可能有更好的链接,但我不知道佳能。试试看。我冒昧地做了一个,因为即使是这么多csh也会让我长出荨麻疹。行为是一样的,只不过它是正确处理空格。这是一个更高级的版本,它还修复了相对路径无限循环错误。@larsmans我称它为pup,因为它可以打印所有内容。不,它没有多大意义,但很容易键入。