심볼릭 링크가 존재하지 않는 파일을 나열하는 방법은 무엇입니까?

심볼릭 링크가 존재하지 않는 파일을 나열하는 방법은 무엇입니까?

다양한 문서로 가득 찬 큰 "myfiles" 디렉토리가 있는데 그 구조를 수정하고 싶지 않습니다.

따라서 각 문서 유형에 대해 (여러) 다른 디렉토리를 만들었습니다. 예를 들어, "myfiles" 디렉토리의 각 파일에 대한 심볼릭 링크와 설명 및 기타 메타데이터와 함께 각 심볼릭 링크(동일한 파일 이름 사용)에 대한 다른 설명 파일을 포함하는 "images" 디렉토리가 있습니다 .jpg. .cr2/images 디렉토리의 심볼릭 링크는 원래 링크된 파일과 이름이 다를 수 있습니다.

나는 "myfiles" 디렉토리에 있는 모든 이미지 파일이 "images" 디렉토리에 대한 심볼릭 링크를 갖도록 하는 가장 간단한 방법을 찾으려고 노력하고 있습니다.

폴더 구조의 예 보기

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

결과가 나와야 한다

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

답변1

질문을 올바르게 이해했다면 이미지에 심볼릭 링크가 없는 myfiles의 파일이 필요합니다.

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

이 방법에는 myfiles/1 디렉토리에 a.jpg 파일이 있고 image/3 또는 단지 image/ 디렉토리에 이를 가리키는 심볼릭 링크가 있는 경우 경고가 표시되며 해당 파일은 심볼릭 링크가 누락된 것으로 보고되지 않습니다.

답변2

myfiles아래 파일은 심볼릭 링크가 아니며 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다 . (이러한 가정을 위반하더라도 내 접근 방식은 여전히 ​​작동하지만 더 복잡해집니다.) 또한 범용 readlink유틸리티가 있고 이것이 -fLinux(GNU 및 BusyBox)의 경우인 정식 경로를 지원한다고 가정합니다. 예를 들어 OSX에는 없습니다.

더 나은 측정을 위해 파일 목록을 작성하고 정렬합니다.

find /myfiles -type f -print | sort >all.list

절대 경로를 사용하여 심볼릭 링크 대상 목록을 만듭니다.

find /images -type f -exec readlink -f {} \; | sort >linked.list

링크되지 않은 파일 나열:

comm -32 all.list linked.list

프로세스 대체를 지원하는 쉘을 사용하는 경우 모든 것을 하나의 명령에 넣을 수 있습니다.

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

아래 링크가 /images절대 링크인 경우 readlink이 옵션을 생략할 수 -f있으며 *BSD 및 OSX에서 사용할 수 있습니다.

관련 정보