Como mover uma pasta para si mesma?

2

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?

    
por leftaroundabout 17.05.2018 / 18:13

4 respostas

5
$ 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.

    
por 17.05.2018 / 18:30
4

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/
    
por 17.05.2018 / 18:37
2

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).

    
por 17.05.2018 / 18:31
1

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 "{}" \;
    
por 17.05.2018 / 19:08