数据所有者要求我通过 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