web-dev-qa-db-ja.com

エコーでファイルを上書きするプロンプト

単純なechoを使用してファイルに書き込みます(他の方法を使用することもできます)。

既に存在するファイルに書き込む場合、ユーザーに上書きするかどうかを確認するエコーを作成できますか?

たとえば、多分-iのような引数が機能しますか?

echo -i "new text" > existing_file.txt

そして、望ましい結果は、ユーザーに上書きするかどうかを促すことです...

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

>リダイレクトは、echoではなく、シェルによって行われます。実際、シェルはコマンドが開始される前にリダイレクトを実行し、デフォルトではシェルは存在する場合はその名前でファイルを上書きします。

noclobber Shellオプションを使用すると、ファイルが存在する場合にシェルによる上書きを防ぐことができます。

set -o noclobber

例:

$ echo "new text" > existing_file.txt

$ set -o noclobber 

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

オプションの設定を解除するには:

set +o noclobber

関数を定義して毎回使用するなどの手動操作を行わずに、ユーザー入力を使用して既存のファイルを上書きするなどのオプションはありません。

2
heemayl

testコマンド(角括弧[でエイリアスされます)を使用して、ファイルが存在するかどうかを確認します

$ 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

または、それをスクリプトに変換します。

$> ./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