Question

J'ai un fichier qui répertorie les noms de fichiers, chacun sur sa propre ligne, et je veux tester si chacun existe dans un répertoire particulier. Par exemple, certains exemples de lignes du fichier peuvent être

mshta.dll
foobar.dll
somethingelse.dll

Le répertoire qui m'intéresse est X: \ Windows \ System32 \ . Par conséquent, je souhaite vérifier si les fichiers suivants existent:

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

Comment puis-je faire cela en utilisant l'invite de commande Windows? Aussi (par curiosité), comment ferais-je cela en utilisant bash ou un autre shell Unix?

Était-ce utile?

La solution

Dans cmd.exe, la FOR / F% variable IN ( nom_fichier ) DO commande devrait vous donner ce que vous voulez. Cela lit le contenu de nom_fichier (et il peut s'agir de plusieurs noms de fichiers) ligne par ligne, en plaçant la ligne dans la variable% (plus ou moins (faites une HELP FOR dans une invite de commande). Si personne ne fournit un script de commande, je tenterai.

EDIT: ma tentative pour un script cmd.exe qui effectue le demandé:

@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

Remarque, le script ci-dessus doit être un script; une boucle FOR dans un fichier .cmd ou .bat, pour une raison étrange, doit avoir un double signe de pourcentage avant sa variable.

Maintenant, pour un script qui fonctionne avec bash | ash | 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

Autres conseils

Bash:

while read f; do 
    [ -f "$f" ] && echo "$f" exists
done < file.txt
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)

Sous Windows:


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

(Ce n'est peut-être pas la meilleure façon de le faire; c'est un moyen que je connaisse; voir aussi http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx )

Dans Bash:


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

Veuillez noter, cependant, qu’en utilisant les systèmes de fichiers par défaut sous Win32 et * nix, il n’existe aucun moyen de garantir le caractère atomique de l’opération, c’est-à-dire que si vous vérifiez l’existence des fichiers A, B et C, certains autres. le processus ou le fil peut avoir supprimé le fichier A après l'avoir passé et pendant que vous cherchiez B et C.

Les systèmes de fichiers tels que NTFS transactionnel peuvent résoudre ce problème. limitation.

Je voulais ajouter un petit commentaire à la plupart des solutions ci-dessus. Ils ne testent pas réellement si un fichier particulier existe ou non. Ils vérifient si le fichier existe et vous y avez accès. Il est tout à fait possible qu'un fichier existe dans un répertoire pour lequel vous ne disposez pas de l'autorisation, auquel cas vous ne pourrez pas visualiser le fichier même s'il existe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top