(아마도 간단한) 스크립트 작성을 시작하기 전에 다음과 같은 기능을 수행하는 명령이 있습니까?
[:~/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 를 누른 다음 줄 끝까지/
시퀀스가 아닌 항목을 검색합니다 ./
- 교체가 비어 있으므로 일치 항목이 직접 삭제됩니다.
t0
s!!!
교체가 수행 되면 레이블로 이동합니다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
)