어떤 이유로 파일 이름에 별표가 있습니다. 변경되지 않으며 내용이 실행되지 않습니다.

어떤 이유로 파일 이름에 별표가 있습니다. 변경되지 않으며 내용이 실행되지 않습니다.

저는 CentOS 공유 서버 환경과 Bash를 사용하고 있습니다.

ll "$HOME"/public_html/cron_daily/

가져오다:

./
../
-rwxr-xr-x 1 user group 181 Jul 11 11:32 wp_cli.sh*

왜 파일 이름 끝에 별표가 있는지 모르겠습니다. 추가한 기억이 없고 변경하려고 하면 다음과 같은 결과가 나타납니다.

[~/public_html]# mv cron_daily/wp_cli.sh* cron_daily/wp_cli.sh
+ mv cron_daily/wp_cli.sh cron_daily/wp_cli.sh
mv: `cron_daily/wp_cli.sh' and `cron_daily/wp_cli.sh' are the same file

이 오류는 내 Cpanel cronjob이 실패한 이유를 나타낼 수 있습니다.

여기에 이미지 설명을 입력하세요.

파일을 변경하거나 Cpanel cron 명령을 실행할 때 제가 뭔가 잘못하고 있는 걸까요? 두 작업 모두 실패한 것 같기 때문입니다.

답변1

별표는 실제로 파일 이름의 일부가 아닙니다. 파일이 실행 가능하고 별칭에 ll다음 플래그가 포함되어 있기 때문에 표시됩니다 -F.

-에프

각 디렉터리 경로 이름 바로 뒤에 슬래시('/')를 표시하고, 각 실행 파일 뒤에는 별표('*')를 표시하고, 각 기호 링크 뒤에는 at 기호('@')를 표시합니다. 각 디렉터리 경로 이름 뒤에는 등호(`=')가 나타납니다. 심볼릭 링크), 각 소켓 뒤에는 퍼센트 기호('%'), 각 공백 뒤에는 퍼센트 기호('%'), 각 FIFO 표현 뒤에는 세로 막대('%')가 있습니다.


Kusalananda가 언급했듯이 이와 같은 cron을 사용하여 디렉터리의 모든 스크립트를 반복할 수는 없습니다. 실행 부분을 사용하면 "$HOME"/public_html/cron_daily/실행 디렉터리(.sh뿐만 아니라)의 모든 스크립트를 호출하거나 다음에 설명된 대로 반복할 수 있습니다.이 게시물.

답변2

Jesse_b이 질문은 이미 답변되었지만 잠재적인 오해를 해결할 가치가 있다고 생각했습니다.

쉘의 문자는 특정 조건에서 특별한 의미를 갖습니다. 예: |파이프, >리디렉션, \이스케이프 문자 등에 사용됩니다. 이러한 문자는 셸에서 문자 그대로 해석되지 않으므로 이 작업을 수행하면 echo foo>bar터미널 foo>bar에 인쇄되는 대신 파일 foo로 리디렉션됩니다 .bar

다행스럽게도 셸에는 이러한 문자가 특별한 의미인 따옴표를 잃게 만드는 메커니즘도 있습니다. POSIX 쉘에서는3가지 인용 메커니즘이 있습니다.:

  • 백슬래시 \:후속 문자의 리터럴 값은 유지되지만 <newline>.
  • 큰따옴표 "...":`, $및 문자를 제외하고 큰따옴표 안에 있는 모든 문자의 리터럴 값을 유지합니다 \.
  • 아포스트로피 '...':예외 없이 작은따옴표 안에 있는 모든 문자의 리터럴 값을 유지합니다.

따라서 이전 예에 따라 문자 그대로 인쇄하려면 foo>bar다음과 같이 할 수 있습니다.

  • echo foo\>bar
  • echo "foo>bar"
  • echo 'foo>bar'

별표는 *이러한 특수 문자 중 하나입니다.패턴 일치 기호그리고 사용파일 이름 확장자. 즉, 다음과 같은 명령은 echo *.txt패턴을 패턴과 일치하는 파일로 바꿉니다.

귀하의 경우 cron_daily/wp_cli.sh*match 만 있으므로 2개의 동일한 매개변수를 cron_daily/wp_cli.sh보고 mv이에 대해 불평합니다. 파일이 없기 때문에 상관없습니다 cron_daily/wp_cli.sh*. 그러나 실제 파일이 있고 cron_daily/wp_cli.sh*패턴과 일치할 수 있는 파일이 더 많으면 mv실패합니다.

다음 시나리오를 고려해보세요.

$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file*
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3

file*따옴표 없이 이름을 바꾸려고 하면 다음과 같습니다 .

$ mv file* new_file
mv: target 'new_file' is not a directory

이는 수신된 매개변수 mv이므로 new_file디렉토리가 필요하기 때문입니다.

$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]

이름을 성공적으로 바꾸려면 file*매개변수를 인용해야 합니다.

$ mv 'file*' new_file
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
-rw-rw-r-- 1 user group 0 jul 14 12:00 new_file

관련 정보