合并名称几乎相同但大小写不同的文件夹

合并名称几乎相同但大小写不同的文件夹

在 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 存在文件夹和不区分大小写的问题。我不确定文件夹名称大写是否是唯一的问题。除了大写字母的文件夹之外,我还遇到了其他可能影响 Dropbox 文件系统的问题,例如从 Mac 共享文件夹并尝试在 Ubuntu 计算机中下载它们。但我发现的问题与这里报告的问题类似。所有文件夹在网络服务器上都可以正确看到,但是下载时,所有以大写字母开头的文件夹都被复制,一些内容进入大写字母文件夹,一些内容进入小写字母文件夹,所以我正在寻找一种方法来合并这些文件夹文件夹。

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

相关内容