質問: 当方、Linuxでシェルスクリプトを書く初心者です。 Webサイトでシェルスクリプトの書き方を確認しながら勉強を進めている状態です。 実現したいこと ------- 以下のようなディレクトリ構成があります。 [/home/xxx/kensyou] →[/01] →→[/aaa.html] →[/02] →→[/bbb.html] →[/03] →→[/ccc.html] →[/script] →→[/delete.sh] 【追加検証分】 →[index.php] この[/home/xxx/kensyou/script/delete.sh]を実行した時、 /home/xxx/kensyou/以下のディレクトリ、ファイルを全て削除したいと考えています。 困っていること ------- ``` #自身の絶対パスを取得 script_dir_path=$(dirname $(readlink -f $0)) #自身のパスの1つ上 kensyouディレクトリ以下のディレクトリとファイルを全て削除 rm -rf "${script_dir_path}/../*" ``` kensyouディレクトリ以下の全てを削除することを期待して、 上記のようなスクリプトを書きましたが、削除されたディレクトリ・ファイルはありませんでした。 しかし、「"${script_dir_path}/../*"」の部分をechoで見てみると、 「/home/xxx/kensyou/script/../*」となる為、「rm -rf /home/xxx/kensyou/script/../*」コマンドになりそうなのに 何故削除されないのかが分かりません。 私が何を間違えているのか、 お詳しい方がいらっしゃれば何卒ご教示頂けますと幸いです。 お手数ですが、宜しくお願い致します。 現在の想定 ----- 上記スクリプトにより、「rm -rf /home/xxx/kensyou/script/../*」というコマンドが発行されるので、 kensyouディレクトリ以下の全てが削除される筈だと思っていた 追加検証 ---- 回答頂いた内容より、 rm -rfのパス指定のクォーテーションを外すことでパスが正しく解釈され、削除が動くようになりました。 しかし、[/home/xxx/kensyou/script/]の直下にファイル(仮にindex.phpなど)がある場合、index.phpの削除がなされないという動作になりました。 ``` script_dir_path=$(dirname $(readlink -f $0)) rm -rf ${script_dir_path}/../* ``` 上記スクリプトのsh -xでの実行結果 ``` +++ readlink -f kensyou/script/delete.sh ++ dirname /home/xxx/kensyou/script/delete.sh + script_dir_path=/home/xxx/kensyou/script + rm -rf /home/xxx/kensyou/script/../01 /home/xxx/kensyou/script/../02 /home/xxx/kensyou/script/../03 /home/xxx/kensyou/script/../script /home/xxx/kensyou/script/../index.php ``` echoの内容としては、index.phpも含まれているため、 rm -rfの対象になりそうなのですが、実際にはindex.phpのみ削除がなされないという結果となりました。 ### 推測 index.phpより先にscriptディレクトリの中身が削除されてしまったため、 index.phpの削除処理が走らなかった?(要検証) → 回答いただいた方の環境では削除がされたので違う ファイルのパーミッションの問題? → chmod 777でフルアクセスにしてみたが、削除されない ``` #スクリプト自身の絶対パス取得 script_dir_path=$(dirname $(readlink -f $0)) #ディレクトリ名取得 script_dir=`echo ${script_dir_path} | awk -F "/" '{ print $NF }'` #最初に自分自身のディレクトリの親ディレクトリから、 #自分自身のディレクトリ以外の配下ディレクトリを削除する ls ${script_dir_path}/../ | grep -v -E ${script_dir} | xargs rm -rf #最後に自分自身のディレクトリの親ディレクトリから、 #全ての配下ディレクトリを削除する rm -rf ${script_dir_path}/../* ``` 上記のような内容で、最初に自分のディレクトリ以外を削除 次に自分を含めて削除とすればどうか検証しましたが、 やはりindex.phpだけが削除されずに残ってしまいました。 また、zzzというディレクトリを作成したところ、index.phpと同様に削除されずに残ってしまうことを確認いたしました。 ### 検証で分かったこと(現状) scriptディレクトリより後にindex.phpが削除されてしまうため、 「/home/xxx/kensyou/script/../index.php」というパスはありませんよ と怒られてしまっている ↓ scriptだけ最後に消したいが、うまくいかない
回答: やってみました。 ``` #!/binsh #自身の絶対パスを取得 script_dir_path=$(dirname $(readlink -f $0)) #自身のパスの1つ上 kensyouディレクトリ以下のディレクトリとファイルを全て削除 rm -rf ${script_dir_path}/../* ``` で、うまくいきました。 ``` rm -rf "${script_dir_path}/../*" ``` だと ``` rm -rf '/home/xxx/kensyou/script/../*' ``` と解釈されますね。 ''で囲まれているのでうまく解釈できないようです。 " をはずすとうまくできました。 ちなみに #!/bin/sh (シェバン)の後ろに -x をつけると動きが追えますよ。