내 디렉터리에 다음 콘텐츠가 있습니다.
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
몇 가지 질문이 있습니다:
readlink -f
절대 경로를 반환하며 접두사-path
가 붙은 상대 경로가 필요합니다./
.- 일부 버전은
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