2008-09-29 7 views
7

Ich habe eine Datei, die Dateinamen auflistet, jeder in seiner eigenen Zeile, und ich möchte testen, ob jeder in einem bestimmten Verzeichnis existiert. Zum Beispiel könnten einige Beispiel Zeilen der DateiWie kann ich testen, ob eine Liste von Dateien existiert?

mshta.dll 
foobar.dll 
somethingelse.dll 

sein Das Verzeichnis I in ist X:\Windows\System32\ interessiert bin, so will ich sehen, ob die folgenden Dateien vorhanden sind:

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

Wie kann ich tun dies mit der Windows-Eingabeaufforderung? Auch (aus Neugierde) wie würde ich dies mit bash oder einer anderen Unix-Shell machen?

Antwort

9

In cmd.exe, die FOR/F%VariableIN (Dateiname) DOBefehl sollten Sie geben, was Sie wollen. Dies liest den Inhalt von Dateiname (und sie könnten mehr als einen Dateinamen sein) Zeile für Zeile, die Zeile in% Variable (mehr oder weniger; machen Sie eine Hilfe für in einer Eingabeaufforderung). Wenn niemand anderes ein Befehlsskript liefert, werde ich versuchen.

EDIT: mein Versuch für einen cmd.exe-Skript, das die angeforderte tut:

@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 

Hinweis, das Skript über muss ein Skript sein; Eine FOR-Schleife in einer .cmd- oder .bat-Datei muss aus irgendeinem seltsamen Grund doppelte Prozentzeichen vor ihrer Variablen haben.

Nun, für ein Skript, das mit bash arbeitet | Asche | 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 
1

In Windows:


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

(Dies kann nicht den besten Weg, es zu tun, es ist ein Weg, ich weiß von, siehe auch http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx)

In Bash:


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

Seine Datei.txt enthält Dateinamen, es ist nicht die Datei, nach der er sucht. – tzot

+0

Diese Lösung funktioniert gut für mich. Vielen Dank! –

9

Bash:

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

Bitte beachten Sie jedoch, dass bei Verwendung der Standard-Dateisysteme unter Win32 und * nix keine Möglichkeit besteht, die Atomarität der Operation zu garantieren, dh wenn Sie die Existenz der Dateien A, B und C überprüfen oder Thread hat Datei A möglicherweise gelöscht, nachdem Sie es übergeben und während Sie nach B und C gesucht haben.

Dateisysteme wie Transactional NTFS können diese Einschränkung überwinden.

1

Ich wollte die meisten der oben genannten Lösungen einen kleinen Kommentar hinzuzufügen. Sie testen nicht wirklich, ob eine bestimmte Datei existiert oder nicht. Sie überprüfen, ob die Datei existiert und Sie Zugriff darauf haben. Es ist durchaus möglich, dass eine Datei in einem Verzeichnis existiert, für das Sie keine Berechtigung haben. In diesem Fall können Sie die Datei nicht anzeigen, obwohl sie existiert.

+0

Was Sie sagen, ist technisch korrekt; praktisch ist es jedoch irrelevant. Wenn ich nicht die Berechtigung zum Lesen/Scannen eines Verzeichnisses habe und daher keine Datei darin finden kann, um seine Existenz zu testen, was ist der Unterschied zu diesem nicht (für mich)? – tzot

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