"mkdir foo; svn mv * foo"

"mkdir foo; svn mv * foo"

나는 종종 이 관용어의 몇 가지 변형을 생각합니다.

$ 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 extglobBash에서는 먼저 실행(에 넣어야 함 ) 해야 합니다 ~/.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

관련 정보