Para copiar o conteúdo de uma pasta que li, o uso é:
cp -rfva ../foldersource/. ./
mas isso funciona também
cp -rfva ../foldersource/* ./
existe alguma diferença?
por exemplo, se eu quiser excluir um conteúdo de uma pasta com. :
rm -rf ../foldersource/.
eu recebo o erro:
rm: rejet delete folder '.' or '..':
mas com asterisco está ok
rm -rf ../foldersource/*
então, o asterisco é melhores opções que funcionam em qualquer lugar?
It's up to the command whether that trailing dot makes any sense
Hum, o ponto sempre está vinculado ao próprio diretório, portanto../foldersource/.
, não deve ser diferente de declarar./foldersource/
e, de fato, é apenas uma maneira redundante de afirmar a mesma coisa. Nenhum comando tenta "entender" o ponto ou o ponto duplo, pois estes são padrão nos sistemas de arquivos Linux / Unix.rm
simplesmente rejeita a remoção do diretório de trabalho atual, conformejimmij
indicado na resposta. Além disso, observe que você está usando./
em todos os seus exemplos enquanto o OP está../
lá. Um pouco de (grande) diferença.cp -rfva ../foldersource/. ./
NÃO é equivalente acp -rfva ../foldersource ./
. O arrasto/.
é significativa.
é uma convenção padrão no Unix para denotar a corrente diretamente. Além disso, obrigado por apontar que eu tinha usado./
nos meus exemplos quando deveria ter usado../
; Eu vou consertar isso. Você está incorreto sobre se os comandos "fazem sentido" do ponto à direita; como o OP aponta (e eu já experimenteicp
) ambosrm
ecp
se comporta de maneira diferente quando um rastro.
está presente. Eu deveria ter escrito algo como "cabe ao comando se o ponto à direita tiver semântica especial ou única". Vou mudar minha resposta para maior clareza.Ao copiar usando,
cp -a source/* target/
você está copiando a maioria dos arquivos e diretórios desource
paratarget
. Especificamente, os itens excluídos provavelmente serão arquivos começando com um ponto (.
) no nível superior desource
.Considere esses arquivos (ou diretórios) em
source
Ao copiar usando,
cp -a source/. target/
você está copiando todo o conteúdosource
, incluindo itens que começam com um ponto (.
) paratarget
Considere esses arquivos (ou diretórios) em
source
Se você estiver usando
bash
,zsh
poderá usar adotglob
opção para alterar o significado de,*
para que ele inclua arquivos e diretórios que começam com um ponto (yash
também tem umadotglob
opção; no entanto, ele inclui.
e..
em expansões globais que limitam sua usabilidade.FIGNORE='@(.|..)'
inksh93
).Curiosamente,
cp -a source/. target/
é garantido nunca criar o componentetarget/source
. (Por outro lado,cp -a source target/
fará uma de duas coisas, dependendo da sua existência ou nãotarget
. Consulte Como copiar uma pasta recursivamente de maneira idempotente usando cp para obter detalhes.)Ao excluir usando,
rm -rf source/*
você exclui os arquivos e diretórios dentro delessource
que não começam com um ponto (.
). Sujeito àdotglob
configuração que eu já mencionei. Não excluirá osource
próprio diretório .Quando você tenta excluir o uso,
rm -rf source/.
ele falha - como outros já explicaram - porque o POSIX proíbe a exclusão de um caminho cujo último componente é.
ou..
. O equivalente mais próximo érm -rf source
, que excluirá osource
diretório e todo o seu conteúdo, independentemente de começarem ou não com um ponto (.
).fonte
rm -rf .
falhar .Você não pode fazer isso
rm -rf ../foldersource/.
porquerm
não permite isso, conforme explicitamente declarado no manual:e no manual POSIX
man 1p rm
, vemos:fonte