find 명령에서 exec 사용 중 오류가 발생했습니다.

find 명령에서 exec 사용 중 오류가 발생했습니다.

Linux 시스템의 모든 사용자에 대한 모든 이메일을 삭제하려면 다음을 실행합니다.

find /var/spool/mail/ -regextype sed -regex "^.*[^/]$" -exec :> {} \;

...하지만 다음과 같은 오류 메시지가 나타납니다.

find: ‘:’: No such file or directory
find: ‘:’: No such file or directory
find: ‘:’: No such file or directory

뭐가 문제 야?

답변1

여기서 정규식을 사용하는 이유는 무엇입니까? 왜 그냥 사용하지 않습니까 find /var/spool/mail/ -type f? -maxdepth 1하위 디렉터리로의 재귀를 방지하려는 경우에 사용합니다.

또한 삭제할 수 있는 사용자 메일함을 왜 자르나요? 예를 들어

find /var/spool/mail/ -type f -delete

또는

find /var/spool/mail/ -type f -exec rm {} +

사용자가 새 메일을 받으면 MTA 또는 MDA는 필요에 따라 올바른 소유권과 권한을 사용하여 mbox 파일을 만듭니다.

답변2

모든 사용자의 편지함을 자르려는 것 같습니다. 외부 유틸리티(셸 내장 유틸리티)가 아니기 때문에 호출 :로는 이를 수행 할 수 없습니다 . 대신 사용하면 일반적으로 외부 명령으로 사용할 수 있으므로 작동하지만...find:true:

또한 를 통해 실행되는 명령에는 리디렉션을 사용할 수 없습니다. -exec리디렉션은 유틸리티가 처음 시작될 때 쉘에 의해 수행되기 때문입니다 find(발견된 각 파일에 대해 한 번이 아니라).

귀하의 명령은 본질적으로 다음과 같습니다

find /var/spool/mail/ -regextype sed -regex "^.*[^/]$" -exec : \; >{}

즉, {}표준 출력 스트림이 find리디렉션될 이름의 파일을 생성합니다.

대신 다음과 같은 작업을 수행할 수 있습니다.

find /var/spool/mail -type f -exec sh -c '
    for pathname do
        : >"$pathname"
    done' sh {} +

"한 줄"로:

find /var/spool/mail -type f -exec sh -c 'for pathname do : >"$pathname"; done' sh {} +

또는 모든 사서함이 바로 아래에 있는 경우 /var/spool/mail,

for pathname in /var/spool/mail/*; do
    : >"$pathname"
done

"한 줄"로:

for pathname in /var/spool/mail/*; do : >"$pathname"; done

두 변형 모두 :유틸리티가 올바르게 호출되고 발견된 모든 경로 이름(지정된 검색 경로 내부 또는 아래의 일반 파일)에 대해 리디렉션이 발생합니다.

관련된:

관련 정보