순수 find 명령을 사용하여 특정 디렉토리에 연결된 모든 소프트 링크 파일 찾기

순수 find 명령을 사용하여 특정 디렉토리에 연결된 모든 소프트 링크 파일 찾기

~, ~/PathA(git 디렉토리) 및 ~/PathB에 2개의 연결된 디렉토리가 있습니다. ~/PathA는 ~/PathB의 하위 디렉터리입니다. 이 두 개는 다른 물리적 디스크에 연결되어 있습니다. ~/PathA/config/~ 아래의 파일에 많은 파일을 연결했습니다.이 링크된 파일을 모두 찾고 싶습니다."xxxxx -> yyyyy" 형식을 표시합니다.

이 방법은 이전/다른 컴퓨터의 구성 파일을 사용할 때 자주 사용됩니다.

스크립트를 작성하거나 파이프를 사용하면 쉽게 할 수 있지만 약간 보기 흉합니다. 하지만 나는 단지 사용한다면 원한다찾다주문하면 할 수 있어요.

편집: 많은 테스트 끝에 알아냈습니다. 가장 중요한 것은-l이름그리고-인쇄.

▶ find ~ -type l ! -path '/home/eexpss/磁盘' ! -path '/home/eexpss/bin' -lname '/home/eexpss/bin/config/*' -printf "%p -> %l\n"
/home/eexpss/.local/share/applications -> /home/eexpss/bin/config/.local+share+applications
/home/eexpss/.local/share/nautilus/scripts -> /home/eexpss/bin/config/.local+share+nautilus+scripts
/home/eexpss/.vimrc -> /home/eexpss/bin/config/fedora.vimrc
/home/eexpss/.proxy.pac -> /home/eexpss/bin/config/.proxy.pac
/home/eexpss/.bash_aliases -> /home/eexpss/bin/config/fedora.bash_aliases
/home/eexpss/.icons -> /home/eexpss/bin/config/.icons/
find: ‘/home/eexpss/磁盘/lost+found’: Permission denied
find: ‘/home/eexpss/磁盘/eexp/.gvfs’: Permission denied
/home/eexpss/.vim -> /home/eexpss/bin/config/.vim
/home/eexpss/.gitconfig -> /home/eexpss/bin/config/.gitconfig

나는 Stéphane Chazelas의 답변을 받아들이겠습니다. 감사해요.

답변1

Standard는 find발견된 파일에 대한 정보를 자체적으로(전체 경로 제외) 인쇄할 수 없습니다. 그러나 일부 find구현에서는 이를 확장합니다.

예를 들어, GNU find(가장 일반적이고 전통적인 GNU/Linux 배포판에 있음)의 경우:

find ~ -type l -printf '%p -> %l\n'

재귀적으로 발견된 심볼릭 링크에 대해 요청한 형식으로 심볼릭 링크를 인쇄합니다(물리적순회(즉, 홈 디렉터리의 디렉터리에 대한 심볼릭 링크를 따르지 않음). 일부 구현에는 find에서 정보를 추출할 수 있는 것과 유사한 -ls형식으로 출력하는 조건자도 있습니다.ls -li

하나 만들고 싶다면논리탐색(디렉토리에 대한 심볼릭 링크를 따라가기)하고 정보를 인쇄합니다. find한 번의 호출만으로는 이를 수행할 수 없지만(GNU의 경우에도 ) globbing을 사용하여 디렉토리를 탐색하고 GNU만 사용하여 정보를 인쇄할 find수 있습니다 .zshfind

find ~/***/*(D@) -printf '%p -> %l\n'

또는 임의의 쉘 및 GNU를 사용하십시오 find(그러나 여러 호출이 필요함).

find -L ~ -xtype l -exec sh -c '
  exec find "$@" -printf "%p -> %l\n"' sh {} +

심볼릭 링크 찾기마지막으로일부를 가리킨다기존의파일 ~/bin/config(구성 요소 ~/bin/config자체가 심볼릭 링크가 아니라고 가정)은 여전히 ​​다음과 같습니다 zsh.

find ~/**/*(D@e{'[[ $REPLY:A = ~/bin/config/* ]]'}) -printf '%p -> %l\n'

관련 정보