심볼릭 링크가없는 파일을 어떻게 나열합니까?


10

기타 문서로 가득 찬 큰 "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

완전한 대답은 아니지만 a의 결과를 find /myfiles -type f파일에 저장 한 다음 find /images -type l -exec readlink {} \; | egrep myfiles심볼릭 링크 된 파일 목록을 얻는 데 사용할 수 있습니다. 각 파일 /images에 대한 결과를 반복하여 sed이미 저장 한 첫 번째 파일의 경로를 삭제합니다. 심볼릭 링크가 있고 남은 파일 은 심볼릭 링크 가없는 파일입니다 .
Bratchley

2
대신 하드 링크를 사용할 수 있습니까? 그러면 하드 링크 카운터를 사용하여 링크가 있는지 확인할 수 있습니까? 사용 ls -l하면 두 번째 열에서 하드 링크 수를 볼 수 있습니다.
Lambert

@Lambert의 말을 따르십시오. rm이러한 심볼릭 링크 pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dir는 예를 들어 jpg와 일치하는 파일에 대해서만 프로그래밍 방식으로 변경된 파일 이름으로 하드 링크를 얻는 데 사용 됩니다. 변경 시간 등을 기반으로 한 일괄 처리와 같이 그 이상으로 많은 것을 얻을 수 있습니다.
mikeserv

답변:


6

질문을 올바르게 이해하면 이미지에 심볼릭 링크가없는 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 디렉토리를 보여줍니다. 실제로 myfiles 아래의 이미지 파일은 임의의 수준의 중첩 디렉토리 안에있을 수 있습니다.
Robert Alexander

전체 파일을 검색하도록 답변을 편집했지만 이것이 원하는지 확인하십시오.
taliezin

거의 :-) 파일에 공백이있을 때 (그리고 아마도 단일 아포스트로피와 같은 다른 크랩이있을 때) 스크립트가 잘립니다.
Robert Alexander

이제 괜찮을 것 같아요
taliezin

마지막 수정은 모든 문자 n이 발생할 때마다 f마다 분할됩니다! :-) IFS 줄을 IFS =로 바꾼 다음 키보드에서 줄 바꿈을 한 다음 다른 줄로 바꿨습니다. 이제 분할이 작동하는 것처럼 보이지만 "missinglinks.sh : 11 : missinglinks.sh : [[: 찾을 수 없음) "
Robert Alexander

3

아래의 파일 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에서 사용할 수 있습니다.


나는 당신의 comm명령 과 같은 것을 게시 하려고했지만 지금은 당신이 이미 한 것을 보지 않을 것입니다. 그러나 리디렉션은 sort의미가 없습니다. 프로세스 대체는 아무것도 출력하지 않습니다. 또한을 제외한 여러 디렉토리에서 심볼릭 링크되지 않은 /images파일을 찾으려면 옆에 많은 디렉토리를 추가 할 수 있습니다 . /myfiles/images
tripleee 2016 년

1
참조 stackoverflow.com/questions/7665/...을 대체하기위한readlink -f
tripleee

@tripleee 프로세스 리디렉션 버전을 만들 때 리디렉션을 제거하는 것을 잊었습니다. 감사합니다. 예, 다른 디렉토리를 쉽게 추가하거나 다른 변형을 할 수 있습니다.
Gilles 'SO- 악한 중지'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.