심볼릭 링크가없는 파일을 어떻게 나열합니까? 디렉토리를 만들었습니다. 예를

기타 문서로 가득 찬 큰 “myfiles”디렉토리가 있으며 해당 구조를 수정하고 싶지 않습니다.

따라서 각 문서 클래스에 대해 다른 디렉토리를 만들었습니다. 예를 들어, “myfiles”디렉토리의 각 파일 .jpg또는 .cr2파일에 대한 심볼릭 링크와 설명 및 기타 메타 데이터가있는 각 심볼릭 링크 (같은 파일 이름 포함)에 대한 다른 설명 파일 이있는 “images”디렉토리가 있습니다 . / 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


답변

질문을 올바르게 이해하면 이미지에 심볼릭 링크가없는 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 파일이 있고 디렉토리 images / 3 또는 단순히 images /에 해당 파일에 대한 심볼릭 링크가있는 경우이 방법에주의해야합니다. 파일에 symlink가 누락 된 것으로보고되지 않습니다.


답변

아래의 파일 myfiles은 기호 링크가 아니며 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다 . (이러한 가정이 위반되었지만 여전히 복잡해지면 내 접근 방식은 여전히 ​​작동 할 수 있습니다.) 또한 일반적인 readlink유틸리티가 있고 -f경로를 정규화 할 수 있다고 가정하지만 Linux (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에서 사용할 수 있습니다.