如何将指定文件夹及其子文件夹的文件递归复制到单个扁平目录?
没问题!完全可以实现把指定文件夹及其子文件夹里的所有文件递归复制到一个单一的扁平目录,不用保留原来的层级结构。下面分不同操作系统给你具体的实现方法:
Linux 和 macOS 系统
用find命令就能轻松搞定,这是最常用的方案:
find /path/to/source -type f -exec cp {} /path/to/destination \;
find /path/to/source:指定要搜索的源文件夹路径-type f:只筛选文件(排除文件夹本身)-exec cp {} /path/to/destination \;:把找到的每个文件{}复制到目标目录
处理重名文件
如果源目录里有同名文件,默认cp会直接覆盖目标目录里的文件。要是想避免覆盖,可以加上-n参数:
find /path/to/source -type f -exec cp -n {} /path/to/destination \;
要是想给重复文件自动加编号备份(比如file.txt变成file.txt.~1~),可以用--backup=numbered:
find /path/to/source -type f -exec cp --backup=numbered {} /path/to/destination \;
Windows 系统
Windows下可以用命令提示符或者PowerShell来实现,两种方式都很方便:
命令提示符(CMD)
打开CMD,输入以下命令(注意替换路径):
for /r "C:\path\to\source" %f in (*) do copy "%f" "C:\path\to\destination"
- 如果是写在批处理(
.bat)文件里,要把%f改成%%f:
for /r "C:\path\to\source" %%f in (*) do copy "%%f" "C:\path\to\destination"
PowerShell
PowerShell的命令可读性更强,而且处理复杂场景更灵活:
Get-ChildItem -Path "C:\path\to\source" -Recurse -File | Copy-Item -Destination "C:\path\to\destination"
-Recurse:递归遍历子文件夹-File:只处理文件,排除文件夹
Windows下处理重名文件
- CMD里的
copy命令默认会询问是否覆盖,输入Y或N选择;要是想自动覆盖所有文件,可以加/Y参数:copy "%f" "C:\path\to\destination" /Y - PowerShell默认会提示是否覆盖,要是想自动覆盖,加上
-Force参数;要是想给重复文件自动重命名(比如file.txt变成file (1).txt),可以用这个进阶命令:
Get-ChildItem -Path "C:\path\to\source" -Recurse -File | ForEach-Object { $destPath = Join-Path "C:\path\to\destination" $_.Name if (Test-Path $destPath) { $baseName = $_.BaseName $extension = $_.Extension $count = 1 while (Test-Path (Join-Path "C:\path\to\destination" "$baseName ($count)$extension")) { $count++ } $destPath = Join-Path "C:\path\to\destination" "$baseName ($count)$extension" } Copy-Item -Path $_.FullName -Destination $destPath }
注意事项
- 替换命令里的
/path/to/source和/path/to/destination(或者Windows对应的路径)为你实际的文件夹路径 - 如果涉及系统文件或者受权限保护的文件,可能需要以管理员身份运行终端/CMD/PowerShell才能完成复制
内容的提问来源于stack exchange,提问作者pindare
相关产品推荐
相关产品推荐

