2008-09-29 9 views
7

Tengo un archivo que enumera los nombres de los archivos, cada uno en su propia línea, y quiero probar si cada uno existe en un directorio en particular. Por ejemplo, algunas líneas de muestra del archivo podría ser¿Cómo puedo probar si existe una lista de archivos?

mshta.dll 
foobar.dll 
somethingelse.dll 

El directorio que estoy interesado es X:\Windows\System32\, así que quiero ver si existen los siguientes archivos:

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

¿Cómo puedo hacer esto usando el símbolo del sistema de Windows? También (por curiosidad) ¿cómo haré esto usando bash u otro shell de Unix?

Respuesta

9

En cmd.exe, la PARA/F%variablesEN (nombre) DO comando debe darle lo que quiere. Esto lee los contenidos de nombre de archivo (y podrían ser más de un nombre de archivo) una línea a la vez, colocando la línea en la variable% (más o menos; haga una AYUDA PARA en un símbolo del sistema). Si nadie más proporciona un script de comando, lo intentaré.

EDIT: mi intento de una secuencia de comandos cmd.exe que hace el pedido:

@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 

Nota, el script anterior debe ser un guión; un bucle FOR en un archivo .cmd o .bat, por alguna extraña razón, debe tener dos signos de porcentaje antes de su variable.

Ahora, por un guión que funciona con bash | cenizas | guión | 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 
1

En Windows:


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

(esto puede no ser la mejor manera de hacerlo, es una forma que conozco; véase también http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx)

En Bash:


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

Su archivo.txt contiene nombres de archivo, no es el archivo que está buscando. – tzot

+0

Esta solución funciona muy bien para mí. ¡Gracias! –

9

Bash:

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

Tenga en cuenta, sin embargo, que al usar los sistemas de archivos predeterminados en Win32 y * nix no hay forma de garantizar la atomicidad de la operación, es decir, si comprueba la existencia de los archivos A, B y C, algún otro proceso o el hilo podría haber eliminado el archivo A después de que lo pasara y mientras buscaba B y C.

Los sistemas de archivos como Transactional NTFS pueden superar esta limitación.

1

que quería añadir un pequeño comentario a la mayoría de las soluciones anteriores. En realidad, no están probando si existe un archivo en particular o no. Están verificando si el archivo existe y usted tiene acceso a él. Es completamente posible que un archivo exista en un directorio para el que no tiene permiso, en cuyo caso no podrá ver el archivo aunque exista.

+0

Lo que dice es técnicamente correcto; prácticamente, sin embargo, es irrelevante. Si no tengo los permisos para leer/escanear un directorio y, por lo tanto, no puedo acceder a un archivo para probar su existencia, ¿cuál es la diferencia que no existe (para mí)? – tzot

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