shell 如何测试文件列表是否存在?

8tntrjer  于 11个月前  发布在  Shell
关注(0)|答案(6)|浏览(113)

我有一个列出文件名的文件,每个文件名都在自己的行上,我想测试每个文件名是否存在于特定的目录中。

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来实现这一点呢?

ifmq2ha2

ifmq2ha21#

在xml.exe中,*FOR /F %variableIN(filename)DO 命令 * 应该给予你想要的内容。它一次读取一行 filename 的内容(它们可以是多个文件名),将该行放在%variable中(或多或少;在命令提示符中执行HELP FOR)。如果没有其他人提供命令脚本,我将尝试。
EDIT:我尝试了一个执行所请求的命令的脚本:

@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一起工作的脚本,|灰|dash| sh| ksh:

filename="${1:-please specify filename containing filenames}"
directory="${2:-please specify directory to check}
for fn in `cat "$filename"`
do
    [ -f "$directory"/"$fn" ] && echo "$fn" exists in "$directory"
done

cwtwac6a

cwtwac6a2#

巴什:

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

字符串

l7wslrjt

l7wslrjt3#

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

字符串

g52tjvyc

g52tjvyc4#

但是,请注意,在Win32和 *nix下使用默认文件系统无法保证操作的原子性,即如果您检查文件A,B和C的存在,则其他进程或线程可能在您传递文件A之后并在您查找B和C时删除了文件A。
Transactional NTFS这样的文件系统可以克服这个限制。

cbjzeqam

cbjzeqam5#

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

9lowa7mx

9lowa7mx6#

在Windows中:

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

字符串
(This可能不是最好的方法;这是我知道的一种方法;另见https://devblogs.microsoft.com/oldnewthing/20080926-00/?p=20743
在Bash中:

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

相关问题