다음과 같은 긴 길이 있다고 가정해 보겠습니다.
/a/b/c/d/e/f
명령을 실행하고 싶습니다.오직경로의 각 하위 경로에서:
예를 들어, 내 명령이 이면 cmd
이를 수행할 수 있는 한 줄을 찾고 있습니다(아마도 한 줄 루프를 사용함).
cmd /a
cmd /a/b
cmd /a/b/c
cmd /a/b/c/d
cmd /a/b/c/d/e
cmd /a/b/c/d/e/f
하나이것이 필요한 이유 중 하나(다른 작업에도 필요함)는 유닉스 팀의 누군가가 cd
이 작업을 단계별로 수행 할 수 있기 /a/b/c/d/e/f
를 원하기 때문입니다. chmod g+x
대안이 있는지 확인합니다.) 피하고 싶습니다 chmod -R g+x /a
.
저는 주로 zsh로 작업하는데, 특정 zsh 기능을 활용할 수 있는 것이 있는지 궁금합니다.
답변1
그것은 마치
path=/a/b/c/d/e/f
while test "$path" != "/"; do
chmod g+x "$path"
path=$(dirname "$path")
done
답변2
입력이 빠르고 모든 쉘에서 작동합니다.
(while [ "$PWD" != / ]; do cmd .; cd ..; done)
대괄호는 디렉터리 변경 사항을 로컬로 유지합니다. 귀하의 예와 마찬가지로 루트 디렉터리는 생략됩니다. cmd
실행이 실패할 경우 실행을 중지 하려면 set -e;
여는 괄호 뒤에 추가하세요.
답변3
구성 파일 에 다음을 추가하세요 zsh
.
function pathargs {
local P=$1; local L=${#P}; shift
local N=1; while [[ $N -le $L ]]; do
[[ ($N == 1 && ${P[1]} = '/') || \
${P[$N]} != '/' && ($N == $L || ${P[$N+1]} == '/') ]] \
&& $@ ${P:0:$N}
N=$(($N+1))
done
}
예:
% pathargs /abc/def/ghi/jkl echo
/
/abc
/abc/def
/abc/def/ghi
/abc/def/ghi/jkl
chmod -R g+x
대신 이것을 사용할 수 있습니다 echo
. 명령은 최상위 디렉토리에서 먼저 호출됩니다.
답변4
어때요?find start_directory -type d -exec my_cmd {} \;
/a
귀하의 예에서 start_directorytype d
디렉터리만 나타냅니다.type f
파일용. 이 매개변수는 파일 및 디렉토리용으로 예약되어 있습니다.cmd
귀하의 예에서 my_cmd{}
찾은 디렉터리 이름으로 교체\;
잊지 마세요. 이 명령이 없으면 명령이 실행되지 않습니다.
실시예 1: /home 아래의 모든 전체 경로 디렉토리 이름이 인쇄됩니다.
find /home -type d -exec echo {} \;
실시예 2:이것은 귀하의 사용 사례입니다:
find /a -type d -exec echo chmod g+x {} \;
명령을 인쇄하지만 실행하지는 않습니다. 실제로 원하는 것인지 확인할 수 있고, 그렇다면 bash(또는 원하는 경우 zsh)로 파이프할 수 있습니다.
find /a -type d -exec echo chmod g+x {} \; | bash