긴 경로의 각 하위 경로에서 지정된 명령을 실행합니다.

긴 경로의 각 하위 경로에서 지정된 명령을 실행합니다.

다음과 같은 긴 길이 있다고 가정해 보겠습니다.

/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_directory
  • type 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

관련 정보