Muitas vezes eu quero fazer alguma variante desse idioma:
$ mkdir 2010
$ svn mv * 2010
Obviamente, recebo um erro porque o glob também corresponde a 2010:
svn: Cannot copy path '2010' into its own child '2010/2010'
Existe uma maneira de substituir "svn mv * 2010"
por uma linha única que faça a coisa certa?
mv
. No entanto, commv
,mv * newdir
funciona para mim, embora com um erro.Respostas:
Sob ksh, bash ou zsh:
No bash, você precisa executar
shopt -s extglob
primeiro (coloque-o no seu~/.bashrc
). No zsh, você precisa executarsetopt -o ksh_glob
primeiro (coloque-o no seu~/.zshrc
).Isso não move arquivos de ponto (arquivos cujo nome começa com
.
). Se você tiver alguns, mova-os separadamente. Tome cuidado para excluir o.svn
diretório, se você tiver um. Em ksh ou zsh:No bash, isso é mais complicado porque você também precisa excluir
.
e explicitamente..
.O Zsh também possui uma sintaxe diferente e mais curta, que requer a execução
setopt -o extended_glob
primeiro (novamente, coloque isso em~/.zshrc
):A primeira expansão da cinta entra em jogo, resultando em
svn mv ^2010 2010
. Em seguida, o padrão^2010
(um atalho para "arquivos correspondentes,*
mas não2010
") é expandido.Se você tiver um
.svn
diretório, será necessário excluí-lo da movimentação. Isso está ok por padrão, pois.svn
não é correspondido por*
(é um arquivo de ponto). No entanto, existem complicações:Se você definiu a
glob_dots
opção, também precisará excluir.svn
:Se você possui arquivos de ponto e não o configurou
glob_dots
, precisará movê-los separadamente:Para fazê-lo de uma só vez:
Outra maneira que funcionaria no zsh nesse caso (se você não tiver subdiretórios) é
svn mv *(.D) 2010
corresponder apenas aos arquivos regulares (.
), incluindo os arquivos de ponto (D
).fonte
O ZSH possui um operador glob útil para combinar tudo, exceto um nome
^
,. Portanto, isso funcionaria (mas é específico ao ZSH, e você precisasetopt extendedglob
primeiro):fonte
!()
sintaxe que funciona comzsh
. Como a^
sintaxe difere? Ele não funciona no meu shell, que opção eu precisaria definir para habilitá-lo?setopt extendedglob
. Eu não sabia!()
, parece uma maneira mais concisa de fazê-losvn mv {^,}2010
evitar digitar o nome do diretório duas vezesSe seus arquivos tiverem nomes "mansos" (sem espaço em branco, caracteres não imprimíveis ou
\[?*
):fonte