移動できますが、シェルスクリプトから削除することはできません。

移動できますが、シェルスクリプトから削除することはできません。

この解決策を見つけてうれしいですが、誰かが私にこれを説明することができます。私はそれについてとてもイライラして、毎回パス名を明示的に説明しました。

CLIから直接実行すると、正常に機能するコマンドを使用してファイルを削除できません。セキュリティ上の理由ですか?おそらくエラーメッセージがないようです。しかし、何もないようです。発生します。

#!/bin/bash

sudo chown -R $USER:$USER "/home/user/project/uploads"
sudo chmod -R 777 "/home/user/project/uploads" 

sudo rm -rf "/home/user/project/uploads/media/*"    # ‹———

しかし、動くのと同じようにするとうまくいきます。

#!/bin/bash

DIR="/home/user/project/tmp/media"
if [ ! -d "$DIR" ]; then
    mkdir "$DIR"
fi

sudo mv "/home/user/project/uploads/media" "/home/user/project/uploads/delete-me-manually"
sudo mv "/home/user/project/tmp/media" "/home/user/project/uploads/media"

それはどういう意味ですか?最初にアンインストールが機能しないのはなぜですか? [1] そして、パスにスペースやその他の文字が含まれていません。また何が問題になるのでしょうか?

私のスクリプトが手動で削除する必要があるゴミを残さないと良いでしょう。


ファイル権限とスクリプトの所有権は次のとおりです。

-rwxr--r-- 1 user user  26K Nov 19 16:23 my-script.sh

シェルはファイル shebang と一致します。

echo $0
bash 

スクリプトは次のように呼び出されます(bashまたは前に付けられませんsh)。

$ ./my-script.sh

dirのファイル権限と所有権は次のとおりです。

drwxr-xr-x 8 user user 4,0K Jul 22 21:02 /home/user/project/
drwx------ 8 user user 4,0K Nov 19 10:44 /home/user/project/tmp/

# At start of script
drwxr-xr-x 9 www-data www-data 36K Nov 19 16:35 /home/user/project/uploads/
drwxr-xr-x 65 www-data www-data 4,0K Nov 19 11:11 /home/user/project/uploads/media/

# After changing it.
drwxrwxrwx 9 user user 36K Nov 19 16:35 /home/user/project/uploads/
drwxrwxrwx 65 user user 4,0K Nov 19 11:11 /home/user/project/uploads/media/

CLIユーザーとスクリプトユーザーは同じです(テストした結果whoami)。

ベストアンサー1

mvあなたはwithと同じことをしていませんrm。あなたがそれらに提供するパス引数を見てください:

rm -rf "/home/user/project/uploads/media/*"
mv     "/home/user/project/uploads/media"   ...

"/home/user/project/uploads/media/*"は引用されているので*特別なものではなく、そのまま渡されますrm。文字通りというファイルを削除します。フラグを/home/user/project/uploads/media/*使用したため、エラーメッセージは表示されません。 「存在しないファイルと不足しているオペランドを無視し、ユーザーにメッセージを表示しません。」-frmGNU マニュアルには次の内容が記載されています。)。

それだけPOSIX仕様-fエラーや警告メッセージを禁止することについてはるかに明示的に説明します。

各ファイルに対して次の手順が実行されます。

  1. ファイルが存在しない場合:
    a。-fオプションを指定しない場合、rm は標準エラーに診断メッセージを記録します。
    b。

を使用しない場合は、-f次のように表示されます。

rm: cannot remove '/home/user/project/uploads/media/*': No such file or directory

mvまたは、のように同じ操作を実行すると、mv "/home/user/project/uploads/media/*" ...文句が発生しますmv -f

引用符がない場合でも、は/home/user/project/uploads/media/*同じではありません/home/user/project/uploads/media。もう一方はディレクトリ内のすべてのファイルのリスト(通常はドットファイルを除く)に展開され、他方はディレクトリ自体の名前を指定しrm -r .../media/*ますmedia。 。 、whilerm -r .../mediaも削除します。

インタラクティブに実行する方法を示していませんでしたが、そこからglobを引用しませんでした。

おすすめ記事