Estou tentando substituir links simbólicos no meu diretório atual pelos arquivos para os quais eles apontam. Achei que tinha entendido 'cp' e o argumento '-L', mas aparentemente não.
Aqui está o comando que estou usando
find ./ -maxdepth 1 -type l -regex ".*\(pdf\|odp\)" | xargs readlink -f | xargs cp -Lf -t .
Aqui está o erro que recebo
cp: '/home/user/dir1/dir2/dir3/file.pdf' and './file.pdf' are the same file
O que estou perdendo
-L
é útil principalmente para cópias recursivas, pois seguir links simbólicos é o padrão caso contrário.E você está passando o destino do link de
cp
qualquer maneira, então se algo não estiver seguindo os links simbólicos para o destino que você deseja, issocp
não perceberá que é o mesmo arquivo, mas-L
/-H
/-P
está preocupado apenas com os links simbólicos na fonte.Aqui você está se deparando com a verificação extra não relacionada que o GNU
cp
faz para que os arquivos de origem e destino sejam os mesmos. Com-f
e o destino sendo um symlink, você poderia argumentar que há um bug aqui, pois a origem não será afetada e o destino será um arquivo diferente.Você pode usar o busybox
cp
, que não faz essa verificação e também suporta essa-t
extensão GNU.Não há necessidade de
readlink
, que de qualquer forma, com sua abordagem, não funcionaria para nomes de arquivos com espaços, aspas ou barras invertidas.Se estiver usando GNU
find
, você pode adicionar um-xtype f
para copiar apenas os arquivos que eventualmente se tornarão arquivos regulares, ou se estiver usandozsh
, você pode simplesmente fazer:O zsh também tem suporte integrado para
readlink -f
(ou seurealpath
equivalente padrão ) com seu:P
modificador, então:Copiaria os arquivos usando o destino realpath, que, a propósito, pode ter nomes de arquivo diferentes e não necessariamente terminar em
.odp
ou.pdf
e pode até mesmo sobrescrever arquivos não relacionados no diretório de trabalho atual, como se você tivesse umfile.pdf
->path/to/file.pdf.old
onde isso acabaria fazendocp -f ./file.pdf.old .
e sobrescreveria ofile.pdf.old
aqui.