web-dev-qa-db-fra.com

Inviter le fichier à écraser en écho

J'écris dans un fichier en utilisant echo (je suis ouvert à l'aide d'autres méthodes).

Lorsque j'écris dans un fichier existant, puis-je faire en sorte que echo invite l'utilisateur à écraser ou non?

Par exemple, peut-être qu'un argument comme -i fonctionnerait?

echo -i "new text" > existing_file.txt

Et le résultat souhaité est de demander à l'utilisateur d'écraser ou non ...

echo -i "new text" > existing_file.txt
Do you wish to overwrite 'existing_file.txt'? y or n:
3
sazr

La redirection > est effectuée par Shell et non par echo. En fait, le shell effectue la redirection avant même que la commande ne soit lancée et, par défaut, le shell écrase tout fichier portant ce nom, le cas échéant.

Vous pouvez empêcher le remplacement par Shell si un fichier existe en utilisant l'option noclobber Shell:

set -o noclobber

Exemple:

$ echo "new text" > existing_file.txt

$ set -o noclobber 

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

Pour désactiver l'option:

set +o noclobber

Vous n'aurez aucune option, comme de prendre les entrées de l'utilisateur pour écraser un fichier existant, sans faire quelque chose de manuel, comme définir une fonction et l'utiliser à chaque fois.

2
heemayl

Utilisez la commande test (alias entre crochets[) pour voir si le fichier 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 transformez cela en 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 "$1" ]; then
   # File exists and write permission granted to user
   # show Prompt
   echo "File exists. Overwrite? y/n"
   read ANSWER
   case $ANSWER in 
       [yY] ) echo "$2" > 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 "$2" > "$1"
fi
2