Como mover o conteúdo de uma pasta para a pasta atual?

5

Eu tenho esta estrutura de pastas:

foo
'----> bar

Como posso extrair o conteúdo de bar em foo ?

Eu tentei mv -f bar/* . dentro de foo .

-f, --force | dont't ask before overwrite

mas eu recebo "não foi possível mover bar/ajax para foo/ajax porque o diretório não está vazio"

Como posso resolver isso?

    
por Black 21.06.2018 / 13:59

5 respostas

7

mv sobrescreverá arquivos, mas recusará substituir diretórios . Não há um único comando que mescle diretórios e remova os diretórios de origem (que é provavelmente o que você quer com mv ). Mesmo rsync --remove-source-files deixará diretórios vazios.

Você pode usar uma combinação de comandos:

cp -a dev/. .
rm -r dev

que copia tudo em dev para o diretório atual e, em seguida, remove o diretório dev .

Ou:

rsync -a --remove-source-files dev/ .
find dev -depth -type d -exec rmdir {} \;

que usa rsync para mover todos os arquivos e, em seguida, exclui os diretórios vazios deixados para trás.

    
por 05.07.2018 / 12:58
1

O manual de referência de mv indica claramente como usar a opção --force .

If a destination file exists but is normally unwritable, standard input is a terminal, and the ‘-f’ or ‘--force’ option is not given, ‘mv’ prompts the user for whether to replace the file. (You might own the file, or have write permission on its directory.) If the response is not affirmative, the file is skipped.

Além disso, o manual destaca por que mv nunca substituirá diretórios não vazios.

Note: ‘mv’ will only replace empty directories in the destination. Conflicting populated directories are skipped with a diagnostic.

Um caminho é mover arquivos e diretórios sem excluir o conteúdo existente no diretório de destino.

-b, --backup[=METHOD]

Make a backup of each file that would otherwise be overwritten or removed.

Todos os arquivos e diretórios são movidos sem problemas e ninguém perde seus dados .

prompt% mv -b /foo_path/bar/* /foo_path
prompt% rmdir -v /foo_path/bar
    
por 05.07.2018 / 19:25
1

Problema na mão

Você deseja mover o conteúdo de foo/bar/ até um nível para foo/ .

Eu irei referenciar este post em superusuário , bem como esta postagem do serverfault no solução.

Solução

Segundo o usuário Stephan202 , você está procurando os seguintes comandos para executar esta tarefa:

cd /path/to/foo/bar
mv * .[^.]* ..

Também deve ser possível, a partir de foo/bar/ , executar o seguinte comando também:

(shopt -s dotglob; mv -- * ..)

Verifique se você tem as permissões corretas também. Se necessário, execute o comando com privilégios root (sudo).

Conclusão

Por favor, comente se você tiver dúvidas ou problemas com esta resposta. Eu sugiro que você leia cada link que eu forneci completamente antes de tentar os comandos. Eu aprecio o feedback para corrigir quaisquer equívocos e melhorar minhas postagens. Eu posso atualizar minha resposta conforme necessário.

Melhor da sorte!

    
por 05.07.2018 / 13:08
0

Se você tiver um diretório foo que contenha apenas um diretório bar . ( bar pode conter outras coisas).

E você deseja renomear foo/barfoo e, em seguida:

mv -T foo foo.original
mv -T foo.original/bar foo
rmdir foo.original

Você pode sair do -T se o seu mv não tiver essa opção, mas fica mais seguro.

    
por 05.07.2018 / 20:15
-2

Basta usar o comando Mover:

cd foo
mv bar/* .

Como Jeff Schaller sugere, use

 shopt -s dotglob 

antes do comando mv para mover arquivos ocultos e usar a opção -i de mv se você quiser uma verificação interativa antes de sobrescrever

    
por 21.06.2018 / 14:03

Tags