Mover arquivos e pastas recursivamente no Linux

57

Considere:

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 faço para mover o conteúdo de /public-back/templates recursivamente com permissões para /public/templates ?

    
por siliconpi 20.04.2011 / 12:24

5 respostas

74

A menos que eu esteja entendendo mal a questão, isso funcionaria:

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

Além disso, a menos que você tenha uma lista enorme de arquivos, adicionar -i perguntará antes de substituir qualquer coisa, o que adiciona segurança ao usar curingas como * .

    
por 20.04.2011 / 16:10
6

A página man do cp diz:

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

Tente;

cp -rp /public-back/templates/* /public/templates/
    
por 20.04.2011 / 16:24
3

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

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

Explicação sobre como funciona abaixo.

BTW, 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 todas as 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.

    
por 17.02.2016 / 08:43
2

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

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

e preserva as permissões e tudo mais.

Nota: nenhum dos itens acima funcionou para mim, é por isso que esta solução alternativa.

    
por 20.10.2015 / 17:24
0
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 somente quando o dir e o destino não tiverem subárvores comuns.

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

    
por 06.09.2017 / 09:05