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