초기 작업 디렉터리를 복원하지 않도록 find를 알릴 수 있나요?

초기 작업 디렉터리를 복원하지 않도록 find를 알릴 수 있나요?

findsudo -u초기 작업 디렉터리가 사용자 조회 실행에 표시되지 않으면 후속 실행에서 "초기 작업 디렉터리를 복원"할 수 있는 방법이 없습니다. 이로 인해 find는 항상 짜증나는 결과를 인쇄합니다.허가가 거부되었습니다경고 메시지:

$ pwd
/home/myuser
$ sudo -u apache find /home/otheruser -writable
find: failed to restore initial working directory: Permission denied

find가 이 메시지를 인쇄하지 못하게 하는 가장 좋은 방법은 무엇입니까?

한 가지 방법은 찾기를 실행하기 전에 찾기 사용자가 복구할 수 있는 디렉터리(예: )로 변경하는 것입니다 cd /. 이상적으로는 예를 들어 찾기 옵션을 원 --do-not-restore-initial-working-directory하지만 사용할 수 없는 것 같습니다. ;)

저는 주로 RedHat 기반 배포판을 사용합니다.

답변1

정리는 실행의 선택적 부분이 아닌 것으로 보입니다 find.

https://github.com/Distrotech/findutils/blob/e6ff6b550f7bfe41fb3d72d4ff67cfbb398aa8e1/find/find.c#L231

에서mainfind.c

  cleanup ();
  return state.exit_status;
}

cleanup수신 전화cleanup_initial_cwd

https://github.com/Distrotech/findutils/blob/e6ff6b550f7bfe41fb3d72d4ff67cfbb398aa8e1/find/util.c#L534

실제로 cleanup_initial_cwd디렉토리를 변경하십시오

https://github.com/Distrotech/findutils/blob/e6ff6b550f7bfe41fb3d72d4ff67cfbb398aa8e1/find/util.c#L456

static void
cleanup_initial_cwd (void)
{
  if (0 == restore_cwd (initial_wd))
    {
      free_cwd (initial_wd);
      free (initial_wd);
      initial_wd = NULL;
    }
  else
    {
      /* since we may already be in atexit, die with _exit(). */
      error (0, errno,
         _("failed to restore initial working directory"));
      _exit (EXIT_FAILURE);
    }
}

cd제안한대로 먼저 쉘 스크립트를 사용해 볼 수 있습니다 /. (이 스크립트에는 검색을 위해 여러 디렉터리를 처리할 수 없는 등 몇 가지 문제가 있습니다.)

#!/bin/sh
path="$(pwd)/$1"
shift
cd /
exec find "$path" "$@"

또한 stderr의 출력을 필터링하여 원하지 않는 메시지를 제거할 수도 있습니다.

#!/bin/sh
exec 3>&2
exec 2>&1
exec 1>&3
exec 3>&-
3>&2 2>&1 1>&3 3>&- find "$@" | grep -v "^find: failed to restore initial working directory"
# not sure how to recover find's exit status
exit 0

관련 정보