대소문자를 구분하지 않는 동일한 파일 이름을 가진 파일 이동

대소문자를 구분하지 않는 동일한 파일 이름을 가진 파일 이동

데이터 소유자는 FTPS를 통해 특정 폴더(및 해당 폴더의 다수의 하위 폴더와 파일)를 클라우드 스토리지 제공업체에 복사하라고 요청했습니다. 이를 달성하기 위해 LFTP를 사용했고 문제가 발생할 때까지 업로드가 제대로 작동했습니다.

동일한 파일 이름을 가진 여러 파일이 포함된 여러 폴더가 있습니다(대소문자 제외). 예를 들어, 폴더데이터다음 파일이 있습니다: 테스트 파일 1.txt,테스트 파일 1.TXT

LFTP를 통해 이러한 파일을 업로드하려고 하면 파일이 이미 존재한다는 오류가 발생합니다. 따라서 제 목적에 맞게 업로드하기 전에 파일을 대소문자를 구분하지 않도록 해야 합니다. 이 문제를 해결하기 위해 현재 디렉터리를 재귀적으로 검색하고 대소문자를 구분하지 않는 중복 항목을 하위 폴더로 이동하는 스크립트를 사용하고 싶습니다. 위의 예에서 스크립트가중복그럼 움직여테스트 파일 1.TXT들어가세요. 중복된 파일 이름이 여러 개 있을 수 있으므로 스크립트는중복 2두 번째 폴더에는 중복된 파일 이름이 있습니다.

또한 내가 확인한 몇몇 "중복" 파일의 경우 파일 크기가 서로 달랐다는 점에 유의해야 합니다. 나는 이 파일들에 대해 어떤 가정도 하지 않습니다실제중복된 내용이 있기 때문에 삭제하는 대신 이동하고 싶습니다.

답변1

다음 bash 스크립트는 현재 디렉터리의 파일을 반복하면서 대소문자를 구분하지 않고 중복된 파일 이름을 찾습니다. 일치하는 항목이 발견되면 아직 존재하지 않는 "중복" 폴더를 만든 다음 중복 파일을 해당 디렉터리로 이동합니다.

*외부 루프의 목적은 파일이 이동됨에 따라 루프된 파일 glob()을 다시 계산하는 것입니다. 파일이 이동되지 않을 때까지 외부 루프가 실행됩니다.

#!/bin/bash

changes=1
while [ $changes -gt 0 ]
do
  changes=0
  for one in *
  do
    for two in *
    do
      shopt -u nocasematch
      # if it's the exact same filename, skip
      [[ "$one" == "$two" ]] && continue
      shopt -s nocasematch
      # if the file name matches case-insensitively, then mv it
      if [[ "$one" == "$two" ]]
      then
        suffix=
        while [ -d Duplicates"${suffix}" ]
        do
          suffix=$((suffix + 1))
        done
        mkdir Duplicates"${suffix}"
        mv "$two" Duplicates"${suffix}"
        changes=1
        break
      fi
    done
  done
done

다음 샘플 파일을 사용하세요.

afile.txt
TestFile1.TXT
TESTfile1.txT
testfile1.txt

이 스크립트를 실행하면 다음이 생성됩니다.

$ tree .
.
├── afile.txt
├── Duplicates
│   └── TestFile1.TXT
├── Duplicates1
│   └── testfile1.txt
└── TESTfile1.txT

답변2

FTP에서 대소문자를 구분하도록 매우 복잡한 스크립트를 작성하는 대신 실제로 FTP에서 대소문자를 구분하도록 설정할 수 있으므로 그럴 필요가 없습니다. LFTP 참조매뉴얼 페이지옵션에 대한 추가 정보: LFTP 명령에 실제로 케이스 플래그가 없는지 확인하십시오.

-i, --nocase 대소문자를 구분하지 않는 패턴 일치

파일 이름이 호스트 시스템에서 유효한 방식으로 폴더를 전송할 수 있습니다. 대상 호스트에 대한 자세한 내용을 추가하면 도움이 될 것입니다.

구현할 수 있는지 확인하는 것이 좋습니다.이 솔루션파일 확장자를 기준으로 합니다.

LFTP mget은 대소문자를 무시합니다.

*.[cC][sS][vV]

나는 당신에게도 이 문제가 없다고 믿습니다.

그래도 실제 요구 사항은 스크립트를 갖는 것입니다. set을 사용하여 Python 스크립트를 만들 수 있습니다.

관련 정보