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:
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.
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