파일이 주어지면 해당 파일이 복사된 하위 디렉터리에서 위치를 찾습니다.

파일이 주어지면 해당 파일이 복사된 하위 디렉터리에서 위치를 찾습니다.

내가 알고 있는 파일이 특정 디렉터리에 복사된 경우 해당 파일의 복사본이 현재 있는 정확한 경로를 찾고 싶습니다. 파일은 편집되지 않으며 사본과 정확하게 동일하게 표시됩니다.

파일이 어디에 있는지에 대한 일부 정보를 알고 있으므로 전체 디렉터리와 모든 하위 디렉터리를 확인할 필요가 없습니다. 이러한 파일에는 파일 복사본이 위치할 수 있는 위치를 좁히는 것으로 알려진 RUN 및 VERSION이라는 두 가지 특성이 있습니다.

이 솔루션은 diff파일을 비교하거나 실제로 보려는 디렉터리를 grep선택하는 데 효과적일 수 있습니다. find그러나 나는 그것들을 어떻게 합치는 지 모르겠습니다.

따라서 우리는 파일( MYFILE=data.txt)이 있고 그 복사본의 경로(예: Jun-09/15/version3/run1)를 알고 싶어하며, 예를 들어 피할 수 있는 일부 디렉터리를 이미 알고 있습니다. 예를 들어, 일부 특정 파일의 경우 RUN=run1이 경우 "run2" 디렉터리를 보면 안 된다는 것을 알 수 있습니다 . 마찬가지로, 우리는 VERSION=version3이 경우 version1이나 version2 디렉토리를 보면 안 된다는 것을 알고 있을 것입니다. 파일의 복사본이 없을 수도 있다는 점은 주목할 가치가 있으며, 이 경우에도 알고 싶습니다.

파일 구조 설명:관련 디렉터리에는 지난 7년 동안의 각 월(예: "Jun-09")에 대한 폴더가 있고, 각 하위 디렉터리에는 현재 달의 각 날짜(예: "11"은 11일을 나타냄)에 대한 폴더가 있습니다. 그런 다음 각 "일" 폴더에는 각 "버전"(관련 데이터의 3개 "버전"이 있음)에 대한 폴더가 있고 각 폴더에는 두 개의 "실행"이 있습니다. 그러나 폴더에 시간별로 파일이 정리되어 있다고 하더라도 파일이 당월에 생성되었거나 마지막으로 편집되었다는 보장은 없습니다.

내 시도:위 구조의 루트에서 실행을 시도했지만 find . -type f -name data.txt | diff ~/myOtherdirectory/files/data.txt"'~/myOtherdirectory/files/data.txt' 이후 피연산자가 누락되었습니다."라는 메시지가 계속 나타납니다. 이상적으로는 내가 보고 있는 파일과 해당 파일이 존재할 수 있는 다른 모든 파일 간의 차이점을 찾는 것입니다. 살펴보기 위해 디렉토리의 범위를 좁히지 않으며 실제로 복사본의 경로를 가져오지도 않습니다.

답변1

나는 당신에게 제안합니다 - 당신의 소프트웨어에 따라 - fslint, duff, fdupes, dmerge, rmlint, rdfind - 그들 모두는 fdupes 또는 dupseek보다 더 빨리 쌍둥이를 찾을 수 있을 것입니다.

나는 다음을 실행할 것이다:

$ find /path -type f -printf "%p - %s\n" | sort -nr -k3 | uniq -D -f1

답변2

myfile=/full/path/to/data.txt

mysearchpath=/my/search/path/root/directory

for file in $(find ${mysearchpath} -type f)
do
  diff ${myfile} ${file} > /dev/null 
  result=${?}
  if [ $result -eq 0 ]
  then
    echo "Identical file found at ${file}"
  fi
done

이는 매우 비용이 많이 드는 접근 방식이지만(컴퓨팅 리소스 측면에서, 특히 다른 작업을 수행하는 다른 사람들과 이 서버를 공유하는 경우). 이러한 파일의 체크섬을 생성할 수 있으며 특정 날짜에 추가된 파일의 체크섬을 생성하는 작업을 실행하고 이를 플랫 파일에 넣을 수 있습니다. 파일을 찾아야 할 경우 파일의 체크섬을 생성하고 이를 체크섬 데이터베이스와 비교합니다. 생각할 거리만 있으면 됩니다.

답변3

정기적으로 확인해야 하는 사항인 경우 cron 작업을 설정하여 파일의 md5 해시 다이제스트를 생성할 수 있습니다.

echo > $digest_file; find $search_path -type f | xargs md5sum >> $digest_file

파일이 복사된 이후에 이것이 실행되었다고 가정하면 먼저 알려진 파일의 해시를 찾은 다음 목록을 확인하여 동일한 해시를 가진 다른 파일이 있는지 확인하십시오. 물론 성능은 검색 경로에 있는 파일의 수와 크기에 따라 달라집니다.

이것의 또 다른 이점은 각 실행 전에 다이제스트를 복사하고 이전 다이제스트와 새 다이제스트를 비교하면 데이터 손상/변경을 감지할 수 있다는 것입니다.

답변4

그리고 :findcmp

find . -type f -exec sh -c 'cmp -s data.txt "$0" 2>/dev/null && echo $0' {} \;

검색을 제한하기 위해 더 많은 기준을 추가할 수 있습니다.

관련 정보