파일 및 해당 파일을 가리키는 모든 디렉터리에 대해 "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주어진 쉘 확장 트릭을 출력하는 것도 /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.
  • /[^/]*$Search 를 누른 다음 줄 끝까지 /시퀀스가 ​​아닌 항목을 검색합니다 ./
  • 교체가 비어 있으므로 일치 항목이 직접 삭제됩니다.
  • t0s!!!교체가 수행 되면 레이블로 이동합니다 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 -- "$@"
}

POSIX적으로:

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

관련 정보