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.