이 해결 방법을 찾아서 기쁘지만 누군가가 나에게 이것을 설명해줄 수 있을 것입니다. 나는 그것에 대해 너무 좌절해서 매번 경로 이름을 명시적으로 설명하기도 했습니다.
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/*
사용했기 때문에 오류 메시지가 표시되지 않을 것입니다. "존재하지 않는 파일과 누락된 피연산자를 무시하고 사용자에게 메시지를 표시하지 않습니다."-f
rm
GNU 매뉴얼에는 다음과 같은 내용이 나와 있습니다.).
그만큼POSIX 사양-f
오류나 경고 메시지를 금지하는 것에 대해 훨씬 더 명시적으로 설명합니다 .
각 파일에 대해 다음 단계가 수행됩니다.
- 파일이 존재하지 않는 경우:
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
. . , while rm -r .../media
도 제거합니다.
대화식으로 실행하는 방법을 보여주지 않았지만 거기에서 glob을 인용하지 않았을 것입니다.