移动具有相同不区分大小写文件名的文件

移动具有相同不区分大小写文件名的文件

数据所有者要求我通过 FTPS 将特定文件夹(及其大量子文件夹和文件)复制到我们的云存储提供商。我使用 LFTP 来实现这一点,上传效果很好,直到遇到问题。

有多个文件夹包含多个文件,这些文件具有相同的文件名(大小写除外)。例如,文件夹数据有以下文件: 测试文件1.txt,测试文件1.TXT

当我尝试通过 LFTP 上传这些文件时,出现文件已存在的错误。因此,出于我的目的,我需要在上传之前不区分文件的大小写。为了解决这个问题,我想使用一个脚本来递归搜索当前目录,并将任何不区分大小写的重复项移动到子文件夹中。在上面的示例中,我希望脚本创建一个名为的子文件夹重复项然后移动测试文件1.TXT进去。我想我可能有多个重复的文件名,所以脚本应该创建一个重复项2第二个重复文件名的文件夹,依此类推。

另外,我应该注意到,对于我检查的几个“重复”文件,它们具有不同的文件大小。我不会对这些文件做出任何假设实际的重复项,这就是为什么我想移动它们而不是删除它们。

答案1

下面的 bash 脚本循环遍历当前目录中的文件,不区分大小写地查找重复的文件名。如果找到匹配项,它会创建一个尚不存在的“重复”文件夹,然后将重复文件移动到该目录中。

*外部循环的目的是为了在文件被移动时重新计算循环的文件 globs ( )。外层循环一直运行,直到没有文件被移动为止。

#!/bin/bash

changes=1
while [ $changes -gt 0 ]
do
  changes=0
  for one in *
  do
    for two in *
    do
      shopt -u nocasematch
      # if it's the exact same filename, skip
      [[ "$one" == "$two" ]] && continue
      shopt -s nocasematch
      # if the file name matches case-insensitively, then mv it
      if [[ "$one" == "$two" ]]
      then
        suffix=
        while [ -d Duplicates"${suffix}" ]
        do
          suffix=$((suffix + 1))
        done
        mkdir Duplicates"${suffix}"
        mv "$two" Duplicates"${suffix}"
        changes=1
        break
      fi
    done
  done
done

使用这些示例文件:

afile.txt
TestFile1.TXT
TESTfile1.txT
testfile1.txt

该脚本的示例运行将创建:

$ tree .
.
├── afile.txt
├── Duplicates
│   └── TestFile1.TXT
├── Duplicates1
│   └── testfile1.txt
└── TESTfile1.txT

答案2

您实际上可以使 FTP 区分大小写,而不是创建一个非常复杂的脚本来区分大小写,这样您就不需要这样做。请参阅 LFTP手册页有关选项的详细信息:检查您的 LFTP 命令实际上是否没有 case 标志。

-i, --nocase 不区分大小写的模式匹配

您可以按文件名在主机上有效的方式传输文件夹。添加有关目标主机的更多详细信息会有所帮助。

我还建议检查您是否可以实施这个解决方案基于文件扩展名。

LFTP mget 忽略大小写

*.[cC][sS][vV]

相信你也没有这个问题。

如果仍然实际要求是有一个脚本。您可以使用 set 创建 python 脚本。

相关内容