Qual é o ponto de mv -f?

34

O manual do GNU Coreutils para mv diz:

-f --force Do not prompt the user before removing a destination file.

No entanto, esse já parece ser o comportamento padrão para mv , então a opção -f parece ser supérflua. Por exemplo. na versão GNU Bash 4.3.11:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

Parece improvável que a intenção do sinal -f seja substituir alias mv="mv -i" , porque há várias maneiras padrão de substituir um alias (por exemplo, usando \mv ) que faria isso de forma mais concisa e consistente com os comandos.

O manual observa que, "Se você especificar mais de uma das opções -i, -f, -n, somente a última entrará em vigor", mas ainda parece improvável que a intenção da -f seja Sobrescreve o sinalizador -i em geral, porque o comportamento equivalente pode ser alcançado simplesmente usando mv , que é muito mais conciso e compreensível do que usar mv -if .

Sendo esse o caso, qual é o objetivo do sinalizador -f ? Por que existe?

    
por sampablokuper 16.10.2015 / 15:41

5 respostas

41

O uso de -f é mais claramente descrito no man page do 4BSD, que foi onde as opções -f e -i foram adicionadas:

If file2 already exists, it is removed before file1 is moved. If file2 has a mode which forbids writing, mv prints the mode and reads the standard input to obtain a line; if the line begins with y, the move takes place; if not, mv exits.

Options:

-i stands for interactive mode. Whenever a move is to supercede an existing file, the user is prompted by the name of the file followed by a question mark. If he answers with a line starting with 'y', the move continues. Any other reply prevents the move from occurring.

-f stands for force. This option overrides any mode restrictions or the -i switch.

Uma definição ainda mais precisa de como o mv opera é dada no padrão POSIX , que adiciona que -f apenas substitui -i se ocorrer mais tarde na linha de comando.

Portanto, o comportamento padrão é um pouco diferente de -f . O padrão é pedir confirmação somente quando o destino não é gravável. (Este comportamento remonta pelo menos a V4 , onde mv não tomou nenhuma opção.) Se a opção -i for dada, mv solicitará adicionalmente a confirmação sempre que o destino existir. A opção -f inibirá a pergunta em ambos os casos (se ocorrer após qualquer -i ).

    
por 16.10.2015 / 17:33
15

É útil quando definimos a execução de mv para um padrão são:

alias mv="mv -i"

Quando você quiser forçar um movimento, isso funcionará:

mv -f

Visto que é a última opção no comando expandido que conta:

mv -i -f

Este ponto também é mencionado no manual do GNU Coreutils .

    
por 16.10.2015 / 15:51
11

Existe porque ( man mv )

If you specify more than one of -i, -f, -n, only the final one takes effect.

Assim, você pode ter um script / apelido / função que sempre pergunta, mas ainda é possível substituir a opção.

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

Uma função / script significativo faria algo mais, claro (por exemplo, registrar a ação).

    
por 16.10.2015 / 15:48
5

O comando mv sozinho pode funcionar de maneira diferente com a opção -f , pois tentará sobrescrever arquivos protegidos contra gravação sem um prompt.

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

Por causa das permissões de gravação no diretório user2, você pode substituir os arquivos user1 em ./dir/ , mas será avisado antes de fazer isso. -f impede o aviso.

    
por 16.10.2015 / 18:11
-1

Na programação shell, usar -f é um idioma comum usado para garantir que seus comandos não sejam anulados com erros ou solicitar ao script / usuário uma resposta interativa ao executar determinados comandos. A última coisa que você quer é que o seu script faça uma pausa esperando pela entrada do usuário, ou talvez pior, pelo comando errado para pegar a entrada do padrão.

Observação: desfazer um alias pode causar / remover efeitos colaterais. Se você tiver aliado o comando para outra versão ou com opções adicionais, desfazer o alias causará efeitos colaterais indesejados. Por exemplo, você pode ter a configuração de alias com mv e rm para usar uma lata de reciclagem (ou outros sistemas de proteção / rastreamento). Desfazer o alias quebrará isso ...

    
por 18.10.2015 / 08:05