2011-04-20 10:24:10 +0000 2011-04-20 10:24:10 +0000
79
79

Mover recursivamente ficheiros e pastas em Linux

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

Respostas (5)

97
97
97
2011-04-20 14:10:36 +0000

A menos que eu esteja a interpretar mal a pergunta, isto funcionaria:

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

Também, a menos que tenha uma lista enorme de ficheiros, adicionar -i irá perguntar antes de escrever por cima de qualquer coisa, o que acrescenta alguma segurança ao utilizar cartões selvagens como o *.

10
10
10
2011-04-20 14:24:07 +0000

A página homem para os estados cp:

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

Tenta;

cp -rp /public-back/templates/* /public/templates/
5
5
5
2016-02-17 07:43:21 +0000

Ao mover itens da minha unidade de polegar 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 de como funciona abaixo.

BTW, Não se esqueça de adicionar uma barra invertida antes de qualquer espaço no nome do directório de origem ou destino (ver 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.

Efectivamente, está a encontrar todos os ficheiros e todas as pastas e a movê-los um a um (ou se um directório for encontrado primeiro, está a movimentar esse directório e os conteúdos nele contidos). Isto inicia um novo processo para cada movimento e é muito ineficiente. Só use isto quando os comandos normais falharem.

2
2
2
2017-09-06 07:05:14 +0000
cp -a --link ../public-back/* /public/. && rm -rf ../public-back

Assim, crie ligações rígidas no directório de destino e remova a barragem de origem. ‘mv’ simplesmente não funcionará no seu caso e, em geral, só funciona quando a barragem de origem e o destino não têm sub-árvores comuns.

Note que estou a assumir que a palavra ‘mover’ na pergunta significa que a barragem de origem deve desaparecer após a operação.

2
2
2
2015-10-20 15:24:37 +0000

mv não parece fazer isto. Mas pode usar este pequeno truque, funciona como um encanto:

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

e preserva as permissões e tudo.

Nota: nenhum dos anteriores funcionou para mim, é por isso que esta solução funciona.