$ cd foo
$ mkdir var1
$ mv * var1
O shell e o comando mv
são espertos o suficiente para não tentar mover o diretório var1 para dentro dele.
Ok, essa pergunta parece boba. O que quero dizer é isto: eu tenho um diretório
foo/
bar.txt
baz.yzw
wun/
a.out
Agora, gostaria de adicionar basicamente um diretório no meio, ou seja, eu gostaria de fazer isso
foo/
var1/
bar.txt
baz.yzw
wun/
a.out
com a intenção de também adicionar outras coisas a foo
, mas separadas do conteúdo antigo.
Eu poderia, claro, 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 são 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 dentro do foo
$ mkdir var1
$ mv foo/* var1
$ mv var1 foo/
Eu gostaria de renomear o diretório e movê-lo para dentro de um novo, aproximadamente como você fez. Para inserir var1/
entre foo
e seu conteúdo:
d=$(mktemp -d ./tmp.XXXXXX)
mkdir "$d"; mv foo "$d"/var1; mv "$d" foo
Isso funciona para o conteúdo do diretório. No entanto, é um pouco mais complicado se considerarmos também o proprietário, os bits de acesso, as ACLs, os atributos estendidos, o número de inode, etc. do diretório.
Se quisermos manter foo
intacto, precisaremos criar var1
novamente e mover o conteúdo. Usando o Bash:
cd foo
mkdir var1
shopt -s dotglob # to get any dotfiles
mv * var1 # ignore the error about moving var1 to itself
Ou, para evitar o erro, use extglob
:
shopt -s extglob
mv !(var1) var1
Observe que $(ls | grep -v)
não incluirá dotfiles e não funcionará se você tiver nomes de arquivos com espaço em branco ou novas linhas (por duas razões diferentes).
Você pode usar rsync
, que criará o diretório de destino (somente último nível), se ele ainda não existir, mas isso resultará em diretórios vazios, que serão excluídos mais tarde ou mantidos.
rsync -rv [--remove-source-files] foo/* foo/var1
Existe uma opção -m, --prune-empty-dirs.
que prune empty directory chains from file-list
na minha página do rsync , mas eu não consegui esse trabalho!
Eu coloquei --remove-source-files
entre chaves para [alertar] sobre isso.
para excluir diretórios vazios:
find foo/ -depth -type d -empty -execdir rmdir "{}" \;