동일한 명령을 사용해야 하는 여러 프로젝트가 있습니다. 프로젝트는 언제나
/home/[username]/public_html/[prjectname]/
내 프로젝트의 모든 디렉터리에서 이 명령을 실행하고 싶기 때문에 프로젝트 라이브러리를 알아야 합니다. 시도했지만 ${path:0:20}
사용자 이름과 프로젝트 이름의 문자열 길이가 다르기 때문에. 난 그냥 알아야 해경로의 처음 네 부분.
답변1
당신은 이미 그것을 언급했습니다 cut
. 구분 기호를 으로 설정하면 됩니다 /
. 약간 직관적이지 않은 부분은 첫 번째 필드 앞의 부분 /
도 (빈) 필드로 계산되므로 필드 1-5가 필요하다는 것입니다.
echo /1/2/3/4/5/6/7 | cut -d/ -f1-5
밝혀지다
/1/2/3/4
답변2
zsh
셸 에서 if $var
is /1/2/3/4/5/6
, ${var:h1}
is /
, ${var:h2}
is /1
, ${var:h3}
is 등 /1/2
(h
머리csh
, / 와 동일 vim
하며 숫자 접미사는 zsh
확장자입니다)
그래서 여기서 떠나는 /home/user/public_html/projectX
것은file=/home/user/public_html/projectX/a/b
dir=${file:h5}
일치하는 모든 디렉토리를 반복하려면 /home/*/public_html/*
다음을 수행하십시오.
for dir in /home/*/public_html/*(N/); do
something with $dir
done
( 디렉토리도 포함하는 심볼릭 링크 (N/)
로 바꾸십시오. 어떤 경우든 첫 번째 링크는 위 디렉토리에 대한 심볼릭 링크와도 일치합니다.)(N-/)
*
이것은(N/)
글로벌 예선, 기능에 따라 다릅니다 zsh
.
답변3
(이중) "매개변수 확장: 일치하는 접두사/접미사 패턴 제거"를 고려할 수 있습니다.
$ path=/home/[username]/public_html/[prjectname]/abc/xyz
$ echo "${path%"${path#/*/*/*/*/}"}"
/home/[username]/public_html/[prjectname]/
외부 명령이 필요하지 않습니다.
답변4
이 시도,
find /path/to/dir -mindepth 4 -type d | cut -d"/" -f -5 | sort -u
type -d
목차만 인쇄됩니다.mindepth
최소 4개의 하위 디렉터리가 있는 디렉터리가 인쇄됩니다.-d"/"
/
자르기 위한 구분 기호 로 사용됨-f -5
다섯 번째 열의 모든 항목을 삭제합니다.sort -u
인쇄물이 정렬될 고유 폴더 경로입니다.