文件的“ls -l”以及指向该文件的所有目录?

文件的“ls -l”以及指向该文件的所有目录?

在我开始编写(可能很简单)脚本之前,是否有一个命令可以执行与以下命令等效的命令:

[:~/software/scripts] % ls -ld / /usr /usr/bin /usr/bin/tee 
drwxr-xr-x 21 root root  4096 Mar 31 08:48 /
drwxr-xr-x 11 root root  4096 Jan 30 09:48 /usr
drwxr-xr-x  2 root root 73728 Apr 14 07:54 /usr/bin
-rwxr-xr-x  1 root root 26308 Jan 16  2013 /usr/bin/tee

无需手动输入所有部分路径?这个想法是能够说

ls --this-new-flag /usr/bin/tee  

或者

command -l /usr/bin/tee 

并具有上面的输出 --- 显示通向最终路径的所有部分路径的详细列表。可以输出/ /usr /usr/bin /usr/bin/tee给定的shell 扩展技巧/usr/bin/tee也可以。

答案1

ls -ld `echo 'path/to/file' | sed ':0 p;s!/[^/]*$!!;t0' | sort -u`

sed部分:

  • :0标签0;
  • p打印;
  • s!p!r!p用替换替换模式r
  • /[^/]*$搜索/,然后搜索任何 not- 序列/直到行尾;
  • replacement 为空,所以直接删除匹配;
  • t0如果s!!!执行替换,则转到 label 0

评论后由OP编辑

我做了以下操作(感谢评论,尤其是 Jander 和 Andrey 的评论):

explode() {echo "$1" | sed -n ':0 p;s![^/]\+/*$!!;t0' | sort -u}

到我的.zshrc然后我可以使用

ls -ld $(explode /path/to/file) 

并具有所需的输出。

答案2

使用大括号扩展怎么样?

$ ls -ld /{,usr/{,bin/{,tee}}}
drwxr-xr-x 23 root root  4096 Mar  7 06:57 /
drwxr-xr-x 10 root root  4096 Jan  9  2013 /usr/
drwxr-xr-x  2 root root 40960 Apr  9 23:57 /usr/bin/
-rwxr-xr-x  1 root root 26176 Nov 19  2012 /usr/bin/tee

答案3

我想不出任何扩展技巧或实用程序可以一次性完成这一切。所以循环是可行的方法。下面是一些可以在 bash 和 zsh 下运行的代码,并且可以容纳具有任意名称的目录。

## Usage: set_directory_chain VAR FILENAME
## Set VAR to the chain of directories leading to FILENAME
## e.g. set_directory_chain a /usr/bin/env is equivalent to
## a=(/ /usr /usr/bin /usr/bin/env)
set_directory_chain () {
  local __set_directory_chain_a __set_directory_chain_path
  __set_directory_chain_a=()
  __set_directory_chain_path=$2
  while [[ __set_directory_chain_path = *//* ]]; do
    __set_directory_chain_path=${__set_directory_chain_path//\/\///}
  done
  if [[ $__set_directory_chain_path != /* ]]; then
    __set_directory_chain_path=$PWD/$__set_directory_chain_path
  fi
  while [[ -n $__set_directory_chain_path ]]; do
    __set_directory_chain_a=("$__set_directory_chain_path" "${__set_directory_chain_a[@]}")
    __set_directory_chain_path=${__set_directory_chain_path%/*}
  done
  eval "$1=(/ \"\${__set_directory_chain_a[@]}\")"
}

## Apply a command to all the directories in a chain
## e.g. apply_on_directory_chain /usr/bin/env ls -ld is equivalent to
## ls -ld / /usr /usr/bin /usr/bin/env
apply_on_directory_chain () {
  local __apply_on_directory_chain_a
   set_directory_chain __apply_on_directory_chain_a "$1"
   shift
   "$@" "${__apply_on_directory_chain_a[@]}"
}

lschain () {
  for x; do apply_on_directory_chain "$x" ls -ld; done
}

请注意,如果这将目录链视为字符串。如果有..组件或符号链接,那么这可能不是您需要的。例如,如果要检查目录的权限,则需要先将目录解析为绝对路径。在 zsh 中,您可以使用/path/to/foo(:A).在 Linux 上,您可以使用readlink -f /path/to/foo.

答案4

zsh

als() {
  until [[ $1 = [/.] ]] {argv[1,0]=$1:h;}; ls -ld -- "$@"
}

POSIXly:

als() (
  while :; do
    case $1 in
      [./]) exec ls -ld -- "$@"
    esac
    set -- "$(dirname -- "$1")" "$@"
  done
)

相关内容