2008-09-29 75 views
7

我有一个文件列出了文件名,每个文件都在自己的行上,我想测试每个文件是否存在于特定目录中。例如,文件的一些样本线可能是如何测试文件列表是否存在?

mshta.dll 
foobar.dll 
somethingelse.dll 

我感兴趣的是X:\Windows\System32\的目录,所以我想看看是否存在以下文件:

X:\Windows\System32\mshta.dll 
X:\Windows\System32\foobar.dll 
X:\Windows\System32\somethingelse.dll 

我该怎么办这使用Windows命令提示符?另外(出于好奇)我将如何使用bash或其他Unix shell来做到这一点?

回答

9

在CMD.EXE中,FOR/F%变量IN()DO命令应该给你你想要的东西。这将读取文件名的内容(并且它们可能多于一个文件名),一次一行,将该行放入%variable(或多或少;在命令提示符下执行HELP FOR)。如果没有人提供命令脚本,我会尝试。

编辑:我尝试了cmd.exe的脚本,并要求:

@echo off 
rem first arg is the file containing filenames 
rem second arg is the target directory 

FOR /F %%f IN (%1) DO IF EXIST %2\%%f ECHO %%f exists in %2 

注意,上面脚本必须是一个脚本; .cmd或.bat文件中的FOR循环出于某种奇怪的原因,必须在它的变量之前有两个百分号。

现在,对于使用bash工作的脚本|灰|仪表| SH | KSH:

​​
1

在Windows中:


type file.txt >NUL 2>NUL 
if ERRORLEVEL 1 then echo "file doesn't exist" 

(这可能不是做的最好的方法,它是一种方法,我知道的;也见http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx

在bash:


if (test -e file.txt); then echo "file exists"; fi 
+0

他的文件。txt包含文件名,它不是他正在检查的文件。 – tzot 2008-09-29 21:39:49

+0

这个解决方案对我来说很好。谢谢! – 2012-10-03 21:59:20

9

Bash:

while read f; do 
    [ -f "$f" ] && echo "$f" exists 
done < file.txt 
1

但是,请注意,在Win32和* nix下使用默认文件系统是无法保证操作的原子性的,也就是说,如果检查文件A,B和C的存在,其他一些进程或线程在您通过它并且您正在查找B和C之后可能已删除文件A.

文件系统(例如Transactional NTFS)可以克服此限制。

1

我想一个小评论添加到最上面的解决方案。他们实际上并不测试一个特定的文件是否存在。他们正在检查文件是否存在,并且您有权访问它。文件完全可能存在于你没有权限的目录中,在这种情况下,即使该文件存在,也无法查看该文件。

2
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)