이름은 거의 동일하지만 대소문자가 다른 폴더를 병합합니다.

이름은 거의 동일하지만 대소문자가 다른 폴더를 병합합니다.

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
' {} \;

관련 정보