列出一个文件夹结构中不在另一个文件夹结构中的文件

时间:2013-07-28 20:12:18

标签: powershell batch-file vbscript cmd

刚拿到一部新手机并暂时将原有的文件复制到我的电脑C:\ OldPhone \

在我的电脑上是我的所有照片,在D:\ Photos。下面的各种文件夹中。

我想要一些代码列出C:\ OldPhone \下面的所有.jpg文件,这些文件不在D:\ Photos \

之下

这有意义吗?只是要强调,文件夹结构不完全相同,我不介意文件的位置,只要它在那里。文件名比较对于初学者来说,添加大小的选项将是一个奖励!

CMD,VBS或powershell会很好,但视觉工作室可以应对的任何事情都可以。

5 个答案:

答案 0 :(得分:3)

试试这个:

for /r "D:\Photos" %%a in (*.jpg) do set "$%%~na=1"
for %%a in (C:\OldPhone\*.jpg) do if not defined $%%~na echo %%~a not in d:\photos

cmd有关联数组,例如 awk 。这不适用于包含=

的文件名

答案 1 :(得分:2)

这应该可以在PowerShell“

中完成
$ht=@{}  # initialize empty hashtable
dir C:\OldPhone\*.jpg -r -file | Foreach {$ht["$($_.Name):$($_.Length)"] = $_.FullName}
dir D:\Photos\*.jpg -r file | Foreach {$ht.Remove("$($_.Name):$($_.Length)")}
$ht  # dump remaining hashtable contents

如果您有多个具有相同名称的文件,这也会考虑文件的大小。理想情况下,为了确保它们是相同的,您将包含MD5文件哈希而不是文件长度作为每个文件的哈希表$ht键的一部分。请注意,-file参数是PowerShell V3中的新参数。您可能不需要它,除非您有一些.jpg作为其名称的一部分的文件夹。

答案 2 :(得分:0)

For /R %%i In (newfiles\*.jpg) Do Call :Check "%%~fi"
GoTo :EOF

:Check
For /R %%i In (existingfiles\*.jpg) Do If /I "%%~nxi"=="%~nx1" GoTo :Found
Echo File %1 doesn't already exist!
GoTo :EOF

:Found
Echo File %1 already exists!
GoTo :EOF

答案 3 :(得分:0)

根据Endoro的回答,这是我最终得到的结果。我真的应该把文件夹位置放到变量中,但它现在有效,所以这就是我所需要的!我也应该将setlocal ... endlocal行放入子程序中。 现在我看一下,OLDFOLDER也是一个愚蠢的名字。编码很差!

将任何丢失的.jpg或.mp4文件复制到文件夹中以便于复制。

echo off
set OLDFOLDER=C:\OldPhone
cls
echo Checking for files in %OLDFOLDER% which aren't in D:\Pictures
del /f /q "D:\Documents\MissingFiles\*"
setlocal
for /r "D:\Photos" %%a in (*.jpg) do set "$%%~nxa=1"
for /r "%OLDFOLDER%" %%a in (*.jpg) do if not defined $%%~nxa copy "%%~a" "D:\Documents\MissingFiles\"
endlocal
setlocal
for /r "D:\Photos" %%a in (*.mp4) do set "$%%~nxa=1"
for /r "%OLDFOLDER%" %%a in (*.mp4) do if not defined $%%~nxa copy "%%~a" "D:\Documents\MissingFiles\"
endlocal
if exist "D:\Documents\MissingFiles\*.*p*" (
  echo Files missing from D:\Photos copied to D:\Documents\MissingFiles\
) else (
  echo There are no files in %OLDFOLDER% which aren't in D:\Photos
)
pause

答案 4 :(得分:-1)

使用fciv(和grep):

fciv .\old -r | grep jpg > old.txt
fciv .\new -r | grep jpg > new.txt

获得

old.txt

6d5f1279d4deccbaeef5d074b13ed2f4 .\old\b\100_1608.jpg
d95e29e2c0172dea438b12c418b09fd3 .\old\b\100_1610.jpg
19f9cda002c951f7a9f870ce74fb1224 .\old\b\100_1601.jpg
32b154f796303a8e9caff0c9d55ba713 .\old\b\100_1600.jpg
26ff43419c4f30764fb015f6d7c869c1 .\old\b\100_1609.jpg
d95e29e2c0172dea438b12c418b09fd3 .\old\a\100_1610.jpg
19f9cda002c951f7a9f870ce74fb1224 .\old\a\100_1601.jpg
32b154f796303a8e9caff0c9d55ba713 .\old\a\100_1600.jpg

new.txt

545b2121a3af2a8e5aa3c5946b450e87 .\new\c\100_1605.jpg
02a1638739302f3c17253beaa3fe9c1b .\new\c\100_1603.jpg
d95e29e2c0172dea438b12c418b09fd3 .\new\c\100_1610.jpg
19f9cda002c951f7a9f870ce74fb1224 .\new\c\100_1601.jpg
32b154f796303a8e9caff0c9d55ba713 .\new\a\100_1600.jpg

使用schema.ini文件:

[old.txt]
Format=Delimited( )
ColNameHeader=False
Col1=MD5 CHAR
Col2=PATH CHAR

[new.txt]
Format=Delimited( )
ColNameHeader=False
Col1=MD5 CHAR
Col2=PATH CHAR

和VBScript:

Option Explicit

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")

Dim oDb : Set oDb = CreateObject("ADODB.Connection")
Dim sCS : sCS     = Join(Array(_
     "Provider=MSDASQL" _
   , "Driver={Microsoft Text Driver (*.txt; *.csv)}" _
   , "DBQ=" & goFS.GetAbsolutePathName("..\data") _
), ";")
Dim sSQL : sSQL   = "SELECT O.* FROM [old.txt] O LEFT JOIN [new.txt] N ON O.MD5 = N.MD5 WHERE N.MD5 IS NULL"
oDb.Open sCS
Dim oRS : Set oRS = oDb.Execute(sSQL)
If Not oRS.EOF Then WScript.Echo oRS.GetString(2, , "|", vbCrLf, "NULL")
oDB.Close

输出:

6d5f1279d4deccbaeef5d074b13ed2f4|.\old\b\100_1608.jpg
26ff43419c4f30764fb015f6d7c869c1|.\old\b\100_1609.jpg

<强>增加:

使用

Dim sSQL : sSQL   = "SELECT O.*, N.PATH FROM [old.txt] O INNER JOIN [new.txt] N ON O.MD5 = N.MD5"

你可以得到重复的内容:

d95e29e2c0172dea438b12c418b09fd3|.\old\a\100_1610.jpg|.\new\c\100_1610.jpg
d95e29e2c0172dea438b12c418b09fd3|.\old\b\100_1610.jpg|.\new\c\100_1610.jpg
19f9cda002c951f7a9f870ce74fb1224|.\old\a\100_1601.jpg|.\new\c\100_1601.jpg
19f9cda002c951f7a9f870ce74fb1224|.\old\b\100_1601.jpg|.\new\c\100_1601.jpg
32b154f796303a8e9caff0c9d55ba713|.\old\a\100_1600.jpg|.\new\a\100_1600.jpg
32b154f796303a8e9caff0c9d55ba713|.\old\b\100_1600.jpg|.\new\a\100_1600.jpg

(参见same approach, similar problem