Dropbox の詳細設定でフォルダを検索すると、フォルダが欠落しています。私はこの事実を一ヶ月過ぎなければわかりませんでした。 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つの方法は、すべてのディレクトリを反復処理して対応する小文字のディレクトリにマージすることです。両方のディレクトリをマージするときに、その内容がすでに正規化されるように、巡回深さを最初に実行します。
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
' {} \;