Avisar sobrescrever arquivo no echo

4

Estou escrevendo em um arquivo usando o simples echo (estou aberto a usar outros métodos).

Ao gravar em um arquivo que já existe, posso fazer com que o echo avise o usuário para sobrescrever ou não?

Por exemplo, talvez um argumento como -i funcione?

echo -i "new text" > existing_file.txt

E o resultado desejado é solicitar ao usuário que sobrescreva ou não ...

echo -i "new text" > existing_file.txt
Do you wish to overwrite 'existing_file.txt'? y or n:
    
por Jake M 09.05.2016 / 07:30

2 respostas

2

O redirecionamento > é feito por shell, não por echo . Na verdade, o shell faz o redirecionamento antes que o comando seja iniciado e, por padrão, o shell substituirá qualquer arquivo com esse nome, se existir.

Você pode evitar a sobrescrita por shell se existir algum arquivo usando a opção noclobber shell:

set -o noclobber

Exemplo:

$ echo "new text" > existing_file.txt

$ set -o noclobber 

$ echo "another text" > existing_file.txt
bash: existing_file.txt: cannot overwrite existing file

Para cancelar a opção:

set +o noclobber

Você não terá nenhuma opção de usar a entrada do usuário para sobrescrever qualquer arquivo existente, sem fazer algo manual como definir uma função e usá-la sempre.

    
por heemayl 09.05.2016 / 07:36
1

Use o comando test (que é aliased por colchetes [ ) para ver se o arquivo existe

$ if [ -w testfile  ]; then                                                                                               
> echo " Overwrite ? y/n "
> read ANSWER
> case $ANSWER in
>   [yY]) echo "new text" > testfile ;;
>   [nN]) echo "appending" >> testfile ;;
> esac
> fi  
 Overwrite ? y/n 
y

$ cat testfile
new text

Ou transforme isso em um script:

$> ./confirm_overwrite.sh "testfile"  "some string"                                                                       
File exists. Overwrite? y/n
y
$> ./confirm_overwrite.sh "testfile"  "some string"                                                                       
File exists. Overwrite? y/n
n
OK, I won't touch the file
$> rm testfile                                                                                                            
$> ./confirm_overwrite.sh "testfile"  "some string"                                                                       
$> cat testfile
some string
$> cat confirm_overwrite.sh
if [ -w "" ]; then
   # File exists and write permission granted to user
   # show prompt
   echo "File exists. Overwrite? y/n"
   read ANSWER
   case $ANSWER in 
       [yY] ) echo "" > testfile ;;
       [nN] ) echo "OK, I won't touch the file" ;;
   esac
else
   # file doesn't exist or no write permission granted
   # will fail if no permission to write granted
   echo "" > ""
fi
    
por Sergiy Kolodyazhnyy 09.05.2016 / 07:47

Tags