eu tenho um diretório
foo/
bar.txt
baz.yzw
wun/
a.out
Agora, basicamente gostaria de adicionar um diretório no meio, ou seja, gostaria de torná-lo
foo/
var1/
bar.txt
baz.yzw
wun/
a.out
com a intenção de também adicionar outras coisas a foo
, mas mantidas separadas do conteúdo antigo.
Claro que posso fazer assim:
$ mkdir foo-new
$ mv foo foo-new
$ mv foo-new foo
ou
$ cd foo
$ mkdir var1
$ mv $(ls | grep -v var1) var1
mas ambos parecem deselegantes e propensos a erros.
Existe uma maneira melhor de fazer isso?
Você pode simplesmente criar o diretório var1, mover todos os arquivos/pastas em foo para var1 e finalmente mover var1 para dentro de foo
O shell e o
mv
comando são inteligentes o suficiente para não tentar mover o diretório var1 para dentro dele mesmo.Eu iria renomear o diretório e movê-lo para dentro de um novo, aproximadamente como você fez. Para inserir
var1/
entrefoo
e seu conteúdo:Isso funciona para o conteúdo do diretório. No entanto, é um pouco mais complicado se também considerarmos o proprietário, bits de acesso, ACLs, atributos estendidos, número de inode etc. do diretório.
Se quisermos manter
foo
intacto, precisaremos criar devar1
novo e mover o conteúdo. Usando o Bash:Ou, para evitar o erro, use
extglob
:Observe que
$(ls | grep -v)
não incluirá dotfiles e não funcionará se você tiver nomes de arquivo com espaço em branco ou novas linhas (por dois motivos diferentes).Você pode usar
rsync
o que criará o diretório de destino (apenas o último nível) se ainda não existir, mas isso resultará em diretórios vazios que você excluirá mais tarde ou manterá.Existe uma opção
-m, --prune-empty-dirs.
naprune empty directory chains from file-list
minha página de manual do rsync , mas não consegui esse trabalho!Eu coloquei
--remove-source-files
entre chaves para ser [avisar] sobre isso.para excluir diretórios vazios: