다음과 같은 디렉토리 목록이 있습니다.
0 -rw-r--r-- 1 root root 0 Sep 2 15:19 aws.greengrass.LambdaLauncher.log
0 -rw-r--r-- 1 root root 0 Sep 2 15:19 aws.greengrass.LambdaRuntimes.log
0 -rw-r--r-- 1 root root 0 Sep 2 14:53 aws.greengrass.Nucleus.log
80 -rw-r--r-- 1 root root 75017 Sep 2 15:55 greengrass_2022_09_02_15_0.log
40 -rw-r--r-- 1 root root 36930 Sep 2 16:50 greengrass_2022_09_02_16_0.log
216 -rw-r--r-- 1 root root 217065 Sep 2 20:40 greengrass_2022_09_02_20_0.log
96 -rw-r--r-- 1 root root 92764 Sep 2 21:54 greengrass_2022_09_02_21_0.log
64 -rw-r--r-- 1 root root 58307 Sep 2 22:57 greengrass_2022_09_02_22_0.log
48 -rw-r--r-- 1 root root 46475 Sep 6 14:37 greengrass_2022_09_06_14_0.log
16 -rw-r--r-- 1 root root 14845 Sep 6 17:57 greengrass_2022_09_06_17_0.log
40 -rw-r--r-- 1 root root 39037 Sep 6 18:11 greengrass_2022_09_06_18_0.log
184 -rw-r--r-- 1 root root 186318 Sep 6 19:48 greengrass_2022_09_06_19_0.log
12 -rw-r--r-- 1 root root 10793 Sep 6 20:25 greengrass_2022_09_06_20_0.log
124 -rw-r--r-- 1 root root 122363 Sep 6 21:43 greengrass.log
이름이 greengrass로 시작하는 파일을 삭제하고 싶습니다. 다음 와일드카드 명령을 시도했지만 아무 것도 작동하지 않습니다.
sudo rm /greengrass/v2/logs/greengrass*.*
sudo rm /greengrass/v2/logs/greengrass*
sudo rm /greengrass/v2/logs/greengrass*.log
나는 얻다:
rm: cannot remove '/greengrass/v2/logs/greengrass*.*': No such file or directory
답변1
지금 일어나고 있는 모든 일은 글로벌 확장에 관한 것입니다.
실행할 때:
sudo rm dir/*
sudo를 실행하는 셸은 "*" 와일드카드 문자를 확장하려고 시도합니다. 디렉토리를 읽을 수 없는 경우 와일드카드는 그대로 sudo에 전달됩니다.
sudo는 실행 rm
되고 dir/*
rm은 전역 확장을 실행하지 않고 쉘 실행만 실행합니다. rm은 *
합법적이지만 특이한 파일 이름인 이라는 파일을 찾고 있습니다 .
sudo를 실행하는 사용자가 디렉터리를 읽을 수 있는 경우 acutall sudo 명령은 다음과 같습니다.
sudo rm dir/filea dir/fileb dir/filec
이것은 작동합니다. 루트를 전역으로 확장하려면 다음과 같이 셸을 사용해야 합니다.
sudo sh -c "rm dir/*"
그런 다음 sudo는 "rm dir/*" 명령을 실행하는 루트로 쉘을 실행합니다. 쉘은 glob을 확장하는 방법을 알고 있으므로 "rm dir/filea dir/fileb ..."가 됩니다.
답변2
일반 사용자가 /greengrass/v2/logs 디렉터리를 읽을 수 있습니까? 그렇지 않은 경우 쉘이 파일 목록과 일치하도록(파일을 전달하기 전에 sudo
) 와일드카드를 확장해야 rm
하고 쉘이 디렉토리의 내용을 나열할 수 없는 경우에는 그런 일이 발생하지 않기 때문에 그렇게 합니다 .
가장 간단한 해결책은 아마도 sudo -s
루트 셸을 열고 rm /greengrass/v2/logs/greengrass*.*
해당 루트 셸에서 실행하는 것입니다. 그런 다음 또는 Control-D를 사용하여 exit
루트 쉘을 종료하고 정상으로 돌아갑니다.