이동할 수는 있지만 쉘 스크립트에서 제거할 수는 없습니다.

이동할 수는 있지만 쉘 스크립트에서 제거할 수는 없습니다.

이 해결 방법을 찾아서 기쁘지만 누군가가 나에게 이것을 설명해줄 수 있을 것입니다. 나는 그것에 대해 너무 좌절해서 매번 경로 이름을 명시적으로 설명하기도 했습니다.

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. . , while rm -r .../media도 제거합니다.

대화식으로 실행하는 방법을 보여주지 않았지만 거기에서 glob을 인용하지 않았을 것입니다.

관련 정보