実質的に同じ名前だが大文字と小文字が異なるフォルダを結合する

実質的に同じ名前だが大文字と小文字が異なるフォルダを結合する

Dropbox の詳細設定を調べていたら、フォルダがなくなってしまいました。このことに気付いたのは、約 1 か月後でした。Dropbox からこのフォルダを取り戻すことはできましたが、サブフォルダのファイル構造は大幅に変更されていました。現在のフォルダには、元のサブフォルダの 2 つのバージョンが含まれています。現在は次のようになっています。

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 ファイル システムに影響する可能性のある問題がありました。しかし、私が見つけた問題は、ここで報告されている問題に似ていました。Web サーバー上ではすべてのフォルダが正しく表示されていましたが、ダウンロードすると、大文字で始まるすべてのフォルダが重複し、一部のコンテンツが大文字のフォルダに、一部のコンテンツが小文字のフォルダに移動したため、これらのフォルダを結合する方法を探していました。

答え2

すべてのコマンドは最上位ディレクトリから開始され、ファイル名に改行がないものと想定しています。GNU ツール (Linux または Cygwin) を想定しています。警告: これはすべてテストされていないコードであり、ブラウザーに直接入力されています。

すべてのディレクトリを小文字にマージするのはかなり簡単です。 1 つの方法は、すべてのディレクトリを再帰的に処理し、それらを小文字の対応するディレクトリにマージすることです。 最初にトラバーサルの深さを実行して、2 つのディレクトリをマージするときに、その内容がすでに正規化されているようにします。

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

関連情報