Mova arquivos e pastas recursivamente no Linux

75

Considerar:

ls -al ../public-back
drwxrwxr-x  4 apache   apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 apache   apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 apache   apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 apache   apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 apache   apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 video

Como mover o conteúdo de /public-back/templatesrecursivamente com permissões para /public/templates?

siliconpi
fonte
mv ../public-back/templates/* public / templates /
mv -R ../public-back/templates/* public/templates/Eu ainda votaria para fazer a pergunta.
2
mv: opção inválida - R @Vladislav Zorov
3
Eu fiz cp -a ../public-back/templates/ public / #

Respostas:

92

A menos que eu esteja entendendo mal a pergunta, isso funcionaria:

mv /public-back/templates/* /public/templates

Além disso, a menos que você tenha uma lista enorme de arquivos, a adição -iperguntará antes de substituir qualquer coisa, o que adiciona alguma segurança ao usar caracteres curinga como *.

DQdlM
fonte
14
Isso não move arquivos ocultos.
Arda
2
Veja askubuntu.com/a/259386/358964 para configurar o dotglob para que os arquivos ocultos também sejam movidos.
Mkobit
3
Nota: Isso não substituirá os arquivos nos subdiretórios. Você receberá uma Directory not emptymensagem.
Armstrongest
Parece que nivelou a hierarquia de diretórios. Não preservei pastas dentro da pasta original para mim. Todos os arquivos acabaram na mesma pasta, em vez de literalmente mover a pasta original com a mesma estrutura.
Robert Noack
Esta solução funciona, mas se você ver este erro: mv: target '/public/templates' is not a directorybasta criar a pasta de destino manualmente: mkdir /public/templates.
Ali Shabdar
8

A página de manual do cp declara:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

Experimentar;

cp -rp /public-back/templates/* /public/templates/
Himalaia
fonte
13
mvé para movimento , enquanto cpé para cópia - uma distinção semântica / etimológica.
Marius Butuc
cpé muito mais lento que mv. cpforça o computador a copiar tudo do disco para a RAM e depois gravá-lo no disco novamente, o que pode demorar muito, dependendo do tamanho dos arquivos. No entanto, mvsempre acontece instantaneamente, porque apenas os links precisam ser reescritos.
T7 #
4

Ao mover itens do meu pen drive para o meu sistema OSMC, achei o seguinte muito útil:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

Explicação sobre como funciona abaixo.

Entre, não se esqueça de adicionar uma barra invertida antes de qualquer espaço nos nomes dos diretórios de origem ou de destino (veja acima).

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

Efetivamente, você está localizando todos os arquivos e pastas e movendo-os um por um (ou, se um diretório for encontrado primeiro, você está movendo esse diretório e o conteúdo nele). Isso inicia um novo processo para cada movimento e é muito ineficiente. Use isso somente quando os comandos regulares falharem.

Pi Hard
fonte
2

MV parece não fazer isso. Mas você pode usar este pequeno truque, funciona como um encanto:

tar cf - . |(cd /targetdir; tar xvf -)

e preserva permissões e tudo.

Nota: nenhuma das opções acima funcionou para mim, é por isso que esta solução alternativa.

svye
fonte
1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Portanto, crie links físicos no diretório de destino e remova o diretório de origem. 'mv' simplesmente não funcionará no seu caso e, em geral, funciona apenas quando source dir e dest não tiverem subárvores comuns.

Observe que estou assumindo que a palavra 'mover' na pergunta significa que o diretório de origem deve desaparecer após a operação.

Boudewijn
fonte