Ele pode remover arquivos, mas os diretórios não são "arquivos".
➜ lab touch file
➜ lab mkdir dir
➜ lab ln -sfT /home file
➜ lab ln -sfT /home dir
ln: dir: cannot overwrite directory
Isso é visto na fonte :
if (remove_existing_files || interactive || backup_type != no_backups)
{
dest_lstat_ok = (lstat (dest, &dest_stats) == 0);
if (!dest_lstat_ok && errno != ENOENT)
{
error (0, errno, _("failed to access %s"), quoteaf (dest));
return false;
}
}
[...]
if (dest_lstat_ok)
{
if (S_ISDIR (dest_stats.st_mode))
{
error (0, 0, _("%s: cannot overwrite directory"), quotef (dest));
return false;
}
if (interactive)
{
fprintf (stderr, _("%s: replace %s? "), program_name, quoteaf (dest));
if (!yesno ())
return true;
remove_existing_files = true;
}
dest_lstat_ok
boolean que começa como false se torna true, a primeira instrução if é chamada desde remove_existing_files
Isso é verdade devido ao sinal --force
, que por sua vez permite que a segunda declaração if seja verificada. Ele se recusa a remover diretórios porque está esperando um arquivo .
Se você não definir o -T
, o que faz com que ln não trate o diretório como não sendo um diretório , o ln criaria um link simbólico sob o diretório com o nome da base da fonte.