나는 종종 이 관용어의 몇 가지 변형을 생각합니다.
$ mkdir 2010
$ svn mv * 2010
물론 glob도 2010과 일치하기 때문에 오류가 발생합니다.
svn: Cannot copy path '2010' into its own child '2010/2010'
"svn mv * 2010"
올바른 일을 할 수 있는 다른 모노라이너로 교체할 수 있는 방법이 있습니까 ?
답변1
ksh, bash 또는 zsh에서:
svn mv !(2010) 2010
shopt -s extglob
Bash에서는 먼저 실행(에 넣어야 함 ) 해야 합니다 ~/.bashrc
. zsh에서는 먼저 setopt -o ksh_glob
실행(에 넣어야 함 ) 해야 합니다 ~/.zshrc
.
도트 파일(이름이 로 시작하는 파일)은 이동하지 않습니다 .
. 있는 경우 별도로 이동하십시오. .svn
디렉터리가 있으면 제외하도록 주의하세요. ksh 또는 zsh에서:
svn mv !(2010) .!(svn) 2010
.
Bash에서는 제외 및 명시적 을 수행해야 하기 때문에 이는 더 복잡합니다 ..
.
svn mv !(2010) .!(svn|.|) 2010
Zsh에는 먼저 실행해야 하는 다른 짧은 구문도 있습니다 setopt -o extended_glob
(다시 입력 ~/.zshrc
).
svn mv {^,}2010
첫 번째 중괄호 확장 svn mv ^2010 2010
이 작동하여 .^2010
*
2010
디렉터리가 있는 경우 .svn
이동에서 제외해야 합니다. .svn
일치하는 항목이 없기 때문에(도트 파일임) 기본적으로는 괜찮습니다 . *
그러나 몇 가지 합병증이 있습니다.
이 옵션을 설정하면
glob_dots
다음 항목도 제외해야 합니다.svn
.svn mv !(2010|.svn) 2010 # requires setopt ksh_glob svn mv *~(.svn|2010) 2010 # requires setopt extended_glob
도트 파일이 있지만 아직 설정하지 않은 경우
glob_dots
개별적으로 이동해야 합니다.svn mv {^,}2010 svn mv .*~.svn 2010
한 번에 완료됨:
svn mv *~(.svn|2010)(D) 2010
이 경우(하위 디렉터리가 없는 경우) zsh에서 작업하는 또 다른 방법은 도트 파일( )을 포함하여 svn mv *(.D) 2010
일반 파일( )만 일치시키는 것 입니다 ..
D
답변2
ZSH에는 주어진 이름을 제외한 모든 항목과 일치하는 유용한 전역 연산자가 있습니다 ^
. 따라서 이것이 작동할 수 있습니다(그러나 이는 ZSH에만 해당되므로 setopt extendedglob
먼저 수행해야 합니다).
$ svn mv ^2010 2010
답변3
파일에 "길들인" 이름이 있는 경우(공백 없음, 인쇄할 수 없는 문자 또는 \[?*
):
svn mv $(ls | grep -vx 2010) 2010