Linux에서 찾기 명령을 사용하여 경로별로 특정 폴더를 제외하는 방법은 무엇입니까?

Linux에서 찾기 명령을 사용하여 경로별로 특정 폴더를 제외하는 방법은 무엇입니까?

내 디렉터리에 다음 콘텐츠가 있습니다.

1/
2/
3/
4/
5/
active -> 1
previous -> 2

이는 폴더와 해당 폴더를 가리키는 두 개의 심볼릭 링크입니다. 심볼릭 링크를 삭제하는 대신 심볼릭 링크에 지정되지 않은 폴더를 모두 삭제하고 싶습니다. 나는 다음을 시도했다

find . -maxdepth 1 -mindepth 1 -type d -not -path "$(readlink -f active)" -not -path "$(readlink -f previous)"

제외하려는 두 디렉터리가 여전히 반환됩니다. 어떻게 되어가나요?

답변1

몇 가지 질문이 있습니다:

  1. readlink -f절대 경로를 반환하며 접두사 -path가 붙은 상대 경로가 필요합니다 ./.
  2. 일부 버전은 readlink거부된 심볼릭 링크에 대한 후행 슬래시가 있는 경로를 반환합니다 find(Ubuntu에서 테스트되었지만 Gentoo에서는 재현할 수 없음).

이것은 Ubuntu에서 나에게 효과적이었지만 아마도 가장 우아한 솔루션은 아닐 것입니다.

find . -maxdepth 1 -mindepth 1 -type d -not -path "./$(readlink active | sed "s/\/$//")" -not -path "./$(readlink previous | sed "s/\/$//")"

realpath다음은 Gentoo에서 테스트한 약간 더 간단한 대안입니다 :

find . -maxdepth 1 -mindepth 1 -type d -not -path "./$(realpath --relative-to=. active)" -not -path "./$(realpath --relative-to=. previous)"

답변2

-not이미 일부 GNUism( , -mindepth, ) 을 사용하고 있으므로 -maxdepth다음을 수행할 수 있습니다.

find -L . -mindepth 1 -maxdepth 1 -type d ! -xtype l \
  ! -samefile active ! -samefile previous

그러면 올바른 형식의 심볼릭 링크 대상( , not , nornor 를 ./1사용하는 경우 ) 에 의존할 필요가 없으며 와일드카드를 이스케이프 처리할 필요가 없습니다(심볼릭 링크가 to 인 경우 하나 필요 ).find .1././1/path/to/1*-path './[*]'

또는 다음을 사용하여 zsh:

print -rl ./*(D/e:'[[ ! $REPLY -ef active && ! $REPLY -ef previous ]]':)

답변3

find다른 디렉토리를 필터링하는 대신 관심 있는 디렉토리에서 실행해 보는 것은 어떨까요?

$ find ./active/ ./previous/

또는

$ find "./$(readlink active)" "./$(readlink previous)" -maxdepth 0
./1
./2

find또는 심볼릭 링크를 정확하게 일치 시키려는 경우아니요방향:

$ find . -mindepth 1 -maxdepth 1  -type d  -not -path "./$(readlink active)" -not -path "./$(readlink previous)"
./3
./4
./5

관련 정보