이름은 거의 같지만 대소문자가 다른 폴더 병합

이름은 거의 같지만 대소문자가 다른 폴더 병합

Dropbox의 고급 설정을 탐색하다가 폴더를 잃어버렸습니다. 한달쯤 지나서야 이 사실을 알게 되었습니다. Dropbox에서 이 폴더를 다시 가져왔지만 하위 폴더의 파일 구조가 크게 변경되었습니다. 이제 현재 폴더에는 각 원본 하위 폴더의 두 가지 버전이 포함되어 있습니다. 현재는 다음과 같습니다.

folder
  /folder1
    /folder11
      /folder111
      /Folder111
       /file1111
       /file1112
       /file1113
    /Folder11
      /file111
      /file112
    /folder12
    /Folder12
  /folder2
  /folder3  

따라서 소문자 하위 폴더가 있고 BumpyCase 하위 폴더가 있습니다. 소문자 하위 폴더에는 하위 폴더가 포함되고 BumpyCase 하위 폴더에는 파일이 포함됩니다. 하위 하위 폴더에는 해당 하위 폴더의 소문자 및 BumpyCase 버전이 다시 포함됩니다. 그리고 이 이야기는 여러 단계에 걸쳐 계속됩니다.

다행히 파일에는 중복이 없고 폴더에만 중복이 있습니다(문자는 동일하지만 대소문자가 다름). 따라서 각 수준에서 이름의 대소문자만 다른 폴더를 병합해야 합니다. 그리고 이 작업을 올바르게 수행하려면 가장 깊은 수준에서 시작하여 최상위 폴더까지 작업해야 합니다.

나는 모든 것이 CamelCase 디렉토리에 들어가길 원합니다.

데이터가 있는 파티션은 Ext4 파티션입니다. 여러 NTFS 파티션에 액세스할 수 있습니다.

편리한 Linux 명령/도구 또는 이를 수행할 수 있는 스크립트에 대한 아이디어를 가진 사람이 있습니까? 물건을 되찾게 되어 벌써부터 매우 기쁘지만, 현재의 구조는 큰 불편을 끼칩니다.

답변1

나는 같은 문제가 있었고 실용적인 해결책을 찾았습니다.

Dropbox 계정으로 이동하여 루트 폴더 이름을 소문자로 변경하고 다시 다운로드하세요!

나는 읽었다다른 곳에서Dropbox에는 폴더 및 대소문자를 구분하지 못하는 문제가 있습니다. 폴더 이름이 대문자인 것이 유일한 문제인지는 잘 모르겠습니다. Mac에서 폴더를 공유하고 Ubuntu 컴퓨터에서 다운로드하려고 하는 등 대문자가 포함된 폴더 외에 Dropbox 파일 시스템에 영향을 줄 수 있는 다른 문제가 있었습니다. 그러나 내가 발견한 문제는 여기에 보고된 문제와 유사했습니다. 웹 서버에서는 모든 폴더가 올바르게 표시되었지만 다운로드할 때 대문자로 시작하는 모든 폴더가 중복되고 일부 콘텐츠는 대문자 폴더로, 일부 콘텐츠는 소문자 폴더로 이동했기 때문에 이를 병합할 방법을 찾고 있었습니다. 폴더.

답변2

모든 명령은 최상위 디렉토리에서 시작하며 파일 이름에 줄 바꿈이 없다고 가정합니다. 나는 GNU 도구(Linux 또는 Cygwin)를 가정합니다. 경고, 이것은 모두 테스트되지 않은 코드이며 브라우저에 직접 입력되었습니다.

모든 디렉토리를 소문자로 병합하는 것은 매우 쉽습니다. 한 가지 접근 방식은 모든 디렉터리를 반복하여 해당 디렉터리를 소문자로 병합하는 것입니다. 두 디렉터리를 병합할 때 해당 콘텐츠가 이미 정규화되도록 순회 깊이를 먼저 수행합니다.

find . -depth -name '*[[:upper:]]*' -type d -execdir sh -c '
  source=$0
  target=$(echo "$source" | tr "[:upper:]" "[:lower:]")
  if [ "$source" != "$target" ]; then  # need to rename or merge
    if [ -d "$target" ]; then
      # merge $source (mixed- or uppercase) into $target (lowercase)
      find "$source" -mindepth 1 -maxdepth 1 -exec mv -bt "$target" {} +
      rmdir "$source"
    else
      mv "$source" "$target"
    fi
  fi
' {} \;

소문자에서 대소문자 혼합으로 병합하려면 각 소문자 디렉터리에 해당하는 대소문자 혼합 디렉터리를 결정해야 합니다. 다음 스니펫은 둘 이상의 디렉토리가 있는 경우 임의의 대소문자 혼합 디렉토리를 선택합니다.

find . -depth ! -name '*[[:upper:]]*' -type d -execdir sh -c '
  source=$0
  target=$(find . -maxdepth 1 -iname "$source" -not -name "$source" -print -quit)
  if [ -n "$target" ]; then …
  fi
' {} \;

관련 정보