有没有找出两个文件夹的重名文件的开源命令行程序?

不要求内容,只找出文件名相同就行。

比如:

a
    |-- 1.txt
    |-- 2
        |-- 1.txt

b
    |-- 1.txt
    |-- 3
        |-- 1.txt

a/1.txt 与 b/1.txt 满足条件
a/1.txt 与 b/3/1.txt 不满足条件

不知道我说清楚了没有,只找出路径结构与文件名相同的。
谢谢

补充:
感谢各位的回复,我有个困扰: 复制或移动文件(夹)时,遇到重名文件怎么办?
1,停下来询问用户,如windows的默认复制逻辑,但如果用户去干别的了,回来一看……
2,事先设置好处理方式,如fastcopy、teraCopy,但问多了令人烦躁

fastcopy 无法重命名,日志无法记录跳过的文件,移动跳过功能需要购买
teraCopy 速度不如fastcopy,但功能齐全,不过日志是SQLite3格式,不好用

我的理想是: 无事别问,默认跳过重名文件并记录下来,完成任务后询问重名文件的处理方式,可以全局处理也可以部分处理。

我找不到这样的软件,貌似只能自己写了

让 chatgpt 帮你写了个脚本,不保证没bug :wink:

import os
import sys

def cache_file_paths(directory):
    file_paths = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.relpath(os.path.join(root, file), directory)
            file_paths.append(file_path)
    return file_paths

def compare_file_paths(dir1, dir2):
    file_paths1 = cache_file_paths(dir1)
    file_paths2 = cache_file_paths(dir2)

    for path1 in file_paths1:
        for path2 in file_paths2:
            if path1 == path2:
                print(path1)

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print('请提供两个文件路径作为参数')
        sys.exit(1)

    dir1 = sys.argv[1]
    dir2 = sys.argv[2]

    compare_file_paths(dir1, dir2)

在命令行中运行这个脚本,并提供两个文件路径作为参数。例如:

python script.py path1 path2

cmd 下执行命令:

forfiles /p "DIR1" /s /c "cmd /c if @isdir==FALSE if exist \"DIR2\@relpath\" echo @relpath"

換種思路,把重名的提前改名。

# pre-rename.ps1
if ($args.Length -lt 2) {
    Write-Host "用法:"
    Write-Host "prerename.ps1 源目錄 目標目錄 後綴"
    exit 1
}

$src = $args[0]
if (-not(Test-Path $src -PathType Container)) {
    Write-Host "${src}非目錄"
    exit 1
}

$dest = $args[1]
if (-not(Test-Path $dest -PathType Container)) {
    Write-Host "${dest}非目錄"
    exit 1
}

# 默認後綴
$ex = "XXX"
if ($args.Length -ge 3) {
    $ex = $args[2]
}

$src_file = Get-ChildItem $src -Recurse

function Get-RelativePath($parent, $child) {
    return [System.IO.Path]::GetRelativePath($parent, $child)
}

foreach ($i in $src_file) {
    $rela = Get-RelativePath $src $i
    if (Test-Path $i -PathType Leaf) {
        $dest_file = Join-Path $dest $rela
        if (Test-Path $dest_file) {
            $new_name = (Get-Item $dest_file).FullName + $ex
            Rename-Item $dest_file -NewName $new_name -Force
            Write-Host "rename $dest_file to $new_name"
        }
    }
}

文件夹比较.

Duplicate Cleaner用来文件查重很好用,建议试一下