찾기를 사용하여 데이터베이스에서 파일 목록을 비교하여 누락 된 파일 찾기


1

다음과 같은 데이터베이스의 2000 파일 목록이 있습니다.

./aa/0f/unique-string/IMG_0987.JPG
./ab/cf/unique-string/IMG_0987.JPG

누락 된 파일을 식별하기 위해 해당 목록을 실제 디렉토리 내용과 비교하고 싶습니다.

다음 명령은 개별적으로 작동하지만 스크립트를 작성하면 작동하지 않습니다 ...

find . -false -samefile ./ab/cf/unique-string/IMG_0987.JPG

내가 가장 가까운 것은 다음과 같습니다.

#!/bin/bash
TEST=`cat ./list.lst`
find . -false -samefile "$TEST"

나는 잘못하고있다. 올바른 방법은 무엇입니까?


Pls는 더 빠른 해결책을 위해 내 대답을 살펴보십시오.
MariusMatutiae 2016 년

답변:


0

find 명령은 한 번에 한 줄씩 공급하지 않기 때문에 list.lst의 전체 내용을 사용하고 있습니다.

while read f; do
find . -false -samefile "$f"
done<./list.lst

한 번에 한 줄씩 file.lst 파일을 읽습니다.


이것은 정확하지만 필요한 것보다 훨씬 느립니다. pls는 내 대답을 참조하십시오.
MariusMatutiae 2016 년

0

전략을 따르면 약 2000x2000 = 4,000,000 개의 비교가 이루어집니다. 이보다 더 잘할 수 있습니다.

목록이 file_t1에 있다고 가정하십시오 . 이제 먼저 PC에서 모든 파일 목록을 생성합니다.

      find . -type f > file_t2

그런 다음 두 파일을 모두 정렬합니다.

      sort -n file_t1 > file1
      sort -n file_t2 > file2

이제 comm 을 사용하여 차이점 목록을 생성합니다.

      comm -X file1 file2

어디에:

      X = 12 -> lines that appear in **both** files
      X = 13 -> lines unique to file 2
      X = 23 -> lines unique to file1

이것은 명확성을 희생하면서 하나의 라이너로 수행 할 수 있습니다.

당신이 관심이 있다면 : 파일이 이미 정렬되어 있기 때문에 훨씬 빠릅니다 ( comm에 대한 엄격한 요구 사항 ). 파일 크기가 N이면 비교를 위해 N 단계를 수행합니다. 정렬에는 N log N 연산이 필요합니다. 이 솔루션에서 가장 비싼 부분 인 반면, 제안한 작업에서는 N ^ 2 작업이 필요 하며 이는 파일 크기에 비해 훨씬 더 깁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.