문맥
내가 있는 디렉토리에는 3개의 폴더가 있습니다. 실행 후 ls -1
순서는 다음과 같습니다.
folder1
folder2
folder3
cd
빨리 들어가고 싶어요 folder2
.
cd
빠르게 함수 를 작성할 수 있었습니다folder1
그것은 내 책임이다.
f1 () {
cd $(ls -d */|head -n 1)
}
질문
라는 함수가 필요합니다 f2
. 실행되면 cd
s가 입력됩니다 folder2
.
(폴더는 으로 정렬됩니다 ls -1
. 저는 을 사용하고 있습니다 zsh
)
답변1
Shell glob은 기본적으로 사전순으로 정렬되며 Zsh에서는 glob 결과의 직접 인덱싱을 허용하므로 다음을 수행할 수 있습니다.
cd2() {
cd -- */([2]); # indexing starts at one
}
Bash에서는 배열을 사용하여 동일한 작업을 수행할 수 있습니다.
cd2() {
local dirs=(*/)
cd -- "${dirs[1]}" # indexing starts at zero
}
둘 다 본질적으로 적어도 두 개의 전역 일치가 있다고 가정합니다. 바라보다코살로난다의 답변이 가정을 다루는 방법을 배우십시오.
또한 ls
별칭을 사용하여 플래그를 지정하면 정렬 순서가 셸의 정렬 순서와 다를 수 있습니다. (저는 Linux에서 별칭을 사용했으며 ls
및 의 정렬 순서도 변경했습니다.) 물론 Zsh는 다양한 다른 정렬 옵션도 제공합니다.ls -vF --color=auto
-v
a
_
참고하시기 바랍니다.당신은 할 수ls | head -2 | tail -1
출력 목록에서 두 번째 파일 이름 가져오기 와 같은 방법을 사용하세요 ls
. 이것은 개행 문자가 있는 파일 이름에는 작동하지 않으며 쉘이 자체적으로 수행할 수 있는 작업을 수행하려면 하나가 아닌 세 개의 외부 프로세스가 필요하므로 이는 별로 좋은 해결책이 아닙니다. . ls */
더 멍청한 건 여기 있으니까껍데기glob을 확장하고 ls
받은 이름만 인쇄합니다. 바라보다https://mywiki.wooledge.org/ParsingLs종속성 출력에서 ls
발생할 수 있는 문제 에 대해 자세히 알아보세요.
답변2
를 사용하면 zsh
다음 내용이 cd
현재 디렉터리 내의 두 번째 디렉터리로 이동합니다.
cd ./*(/[2])
/
대괄호 안에는 glob에 대한 수정자가 있어 *
디렉터리 이름만 일치하고(설명서 참조 zshexpn
) [2]
이 glob과 일치하는 두 번째 디렉터리를 추출합니다.
함수로 감싸십시오.
cd2nd () { cd ./*(/[2]); }
현재 디렉토리에 두 번째 디렉토리가 없으면 홈 디렉토리로 이동합니다. 두 번째 디렉터리가 존재하는지 먼저 테스트하여 이를 방지할 수 있습니다.
cd2nd () { [ -d ./*(/[2]) ] && cd ./*(/[2]); }
하지만 이제 모델을 확장해 보겠습니다.두 배.
/bin/sh
(또는 ) 에는 zsh
전역 일치 항목이 하나만 있습니다.
cd2nd () { set -- ./*/; [ -d "$2" ] && cd "$2"; }
이는 위치 인수를 사용하여 모든 하위 디렉터리 이름(일치하는 디렉터리만)을 저장하고 */
, 두 번째 하위 디렉터리가 있는지 테스트하고, 존재하는 경우 해당 디렉터리를 변경합니다.
답변3
인수와 인수가 변경되어야 하는 디렉터리 번호를 받아들이는 함수
function ff()
{
cd "$(ls -d */ | head -n $1 | tail -n 1)";
}
용법:
user@localhost:~ $ ff 2
user@localhost:~/Desktop $
설명하다:
ls -d */
현재 디렉터리 아래의 모든 디렉터리 나열head -n $1
첫 번째 디렉터리 만$1
나열되고$1
함수 인수이므로cc 2
그때 호출하면$1
값을 가져옵니다2
(처음 두 줄은 현재 처리 중입니다).tail -n 1
마지막 행만 선택- 이 모든 것이
cd
명령으로 전송되므로 디렉터리가 올바른 디렉터리로 변경됩니다(따옴표가 있으므로 공백이 있는 디렉터리 이름은 인수로 구문 분석됩니다).
경고하다!
이 버전에서는 입력에 문제가 없다고 가정합니다. 향후 예상치 못한 오류를 방지하려면 입력(사용자 및 파일 시스템 디렉터리 목록에서)을 확인해야 합니다.