(おそらく単純な)スクリプトの作成を始める前に、次の機能を実行するコマンドはありますか?
[:~/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
。/[^/]*$
検索を押してから、行の最後まで/
シーケンスがない項目を検索します。/
- 置換が空であるため、一致は直接削除されます。
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
)