我有两个文件夹,两个文件夹中都有文件。我想比较两个文件夹的文件名,并希望将不匹配的文件移动/复制到第三个文件夹。
如何在没有任何工具的情况下做到这一点?
我想用
cmd
来执行此操作。
示例:
文件夹1:
Filename1.pdf
Filename2.pdf
Filename3.tiff
Filename4.jpg
文件夹2:
Filename1.pdf
Filename2.pdf
Filename3.tiff
Filename4.jpg
Filename5.pdf
Filename6.jpg
结果:
文件夹3:
Filename5.pdf
Filename6.jpg
正如Stephan指出的,这段代码是针对linux命令行的,而不是针对windows cmd的。所以它需要 git bash 终端或 wsl 才能运行。
问题是关于cmd(Windows命令行)的。跑步 Unix/Linux 代码需要安装额外的工具,这 提问者明确不想要。
此代码会将文件夹 1 和文件夹 2 中所有不匹配的文件复制到文件夹 3 中。
第一行获取folder1 & 的所有目录和文件 folder2 并将它们列在文件中。
(ls -d folder1/* && ls -d folder2/*) > dir.txt
此行获取两个目录中都不存在的不匹配文件,并将它们列在一个文件中。
diff -r <(ls folder1) <(ls folder2) | sed 's/^< //' | sed 's/^> //' > unique.txt
此行从不匹配的文件中存在的目录文件中greps完整的文件路径并列出它们。
grep -wFf unique.txt dir.txt | sed 's/^< //' | sed 's/^> //' > tocopy.txt
现在我们有了所有文件路径的列表,我们可以将它们复制到folder3。
cp -r $(cat tocopy.txt) folder3
对于没有设置隐藏属性的文件,可以使用带有以下代码的批处理文件来完成该任务:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFolder1=C:\Full Path\Folder 1"
set "SourceFolder2=C:\Full Path\Folder 2"
set "TargetFolder=C:\Full Path\Folder 3"
if not exist "%SourceFolder1%\" echo ERROR: Missing source folder 1: "%SourceFolder1%"& goto ErrorExit
if not exist "%SourceFolder2%\" echo ERROR: Missing source folder 2: "%SourceFolder2%"& goto ErrorExit
md "%TargetFolder%" 2>nul
if exist "%TargetFolder%\" goto CopyFiles
echo ERROR: Failed to create target folder: "%TargetFolder%"
:ErrorExit
echo/
pause
exit /B 1
:CopyFiles
rem Copy all files being unique in source folder 1 to target folder.
for %%I in ("%SourceFolder1%\*") do if not exist "%SourceFolder2%\%%~nxI" copy "%%I" "%TargetFolder%\"
rem Copy all files being unique in source folder 2 to target folder.
for %%I in ("%SourceFolder2%\*") do if not exist "%SourceFolder1%\%%~nxI" copy "%%I" "%TargetFolder%\"
rem Remove the target folder on being still empty and restore previous environment.
rd "%TargetFolder%" 2>nul
endlocal
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
copy /?
echo /?
endlocal /?
exit /?
for /?
goto /?
if /?
md /?
pause /?
rd /?
rem /?
set /?
setlocal /?
另请参阅 使用 Windows 批处理文件的单行多个命令,了解无条件命令运算符
&
的说明。