Por que alguns comandos do GNU Coreutils têm a -T/--no-target-directory
opção? Parece que tudo o que faz pode ser alcançado usando a semântica do .
(ponto próprio) em uma hierarquia de diretórios Unix tradicional.
Considerando:
cp -rT /this/source dir
A -T
opção impede que a cópia crie um dir/source
subdiretório. Em vez disso, /this/source
é identificado dir
e o conteúdo é mapeado entre as árvores de acordo. Então, por exemplo, /this/source/foo.c
vai dir/foo.c
e assim por diante, ao invés de dir/source/foo.c
.
Mas isso pode ser facilmente realizado sem a -T
opção usando:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Semanticamente, o componente de ponto final é copiado como filho de dir
, mas é claro que "filho" já existe (portanto, não precisa ser criado) e é realmente dir
ele próprio; portanto, o efeito é o /this/path
identificado dir
.
Funciona bem se o diretório atual for o destino:
cp -r /this/tree/node/. . # node's children go to current dir
Existe algo que você pode fazer única com -T
que pode racionalizar a sua existência? (Além do suporte para sistemas operacionais que não implementam o diretório de pontos, uma justificativa não mencionada na documentação.)
O truque de pontos acima não resolve as mesmas condições de corrida mencionadas na documentação sobre o GNU Info -T
?
.
truque faz o trabalho ao copiar um arquivo, não apenas quando renomear seu nome base, ao mesmo tempo!cp /path/to/file /target/dir/.
Se/target/dir/file
existe e é um diretório, você obtém o mesmo diagnóstico! Mas você mostrou o-T
que isso não pode ser feito sem ele em uma etapa, sem condições de corrida: copie um arquivo e altere seu nome sem que ele seja desviado para um subdiretório..
truque que você está falando está anexando/.
à fonte .O problema com
cp
/mv
/ln
como eles foram projetados originalmente é que eles são dois comandos em um ( copiar e copiar ).é copiar A para B ou copiar A para B ( copiar A para B / A ), dependendo de
B
existir ou não ser um diretório (e mais variações se B for um link simbólico para um diretório).Isso é ruim porque é ambíguo. Portanto, as implementações do GNU adicionaram opções para contornar isso.
copia de A a B independentemente. Se
B
existir e for um diretório, isso falhará (a menos que você passe-r
). Em qualquer caso, você não terminará com umA
arquivoB
quando pretenderA
ser copiado para B.E:
é a cópia para .
fonte
cp A B
o comando, não fará o que você pretendia. E fazer[ -e B ] || [ -L B ] || cp A B
ainda tem uma condição de corrida quecp -Tn A B
não tem.O
-T
pode fornecer uma falha se um diretório existir incorretamente para o que deve ser um arquivo de destino:Ou seja, em vez de obter êxito em uma cópia inesperada em um subdiretório, ocorre um status de aviso e de saída não boa, que pode causar o cancelamento de um script e inspecionar por que um diretório não deveria ser Seja um.
fonte
O uso de um sinalizador também é muito mais claro e tem menos risco de efeitos indesejados, quando o comando é usado em um script em vez de inserido manualmente. A aplicação de pontos nos caminhos de um script pode acabar em todos os tipos de travessuras inesperadas.
fonte