8 Stimmen

Wie kann ich prüfen, ob eine Liste von Dateien existiert?

Ich habe eine Datei, die Dateinamen auflistet, jeder in einer eigenen Zeile, und ich möchte testen, ob jeder in einem bestimmten Verzeichnis existiert. Einige Beispielzeilen der Datei könnten zum Beispiel lauten

mshta.dll
foobar.dll
somethingelse.dll

Das Verzeichnis, an dem ich interessiert bin, ist X:\Windows\System32\ Ich möchte also sehen, ob die folgenden Dateien existieren:

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

Wie kann ich dies über die Windows-Eingabeaufforderung tun? Und (aus reiner Neugier) wie würde ich das mit der Bash oder einer anderen Unix-Shell machen?

10voto

JesperE Punkte 61161

Bash:

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

10voto

tzot Punkte 86792

In cmd.exe wird die FOR /F % variabel IN ( Dateiname ) DO Befehl sollte Ihnen geben, was Sie wollen. Dies liest den Inhalt von Dateiname (und das können mehrere Dateinamen sein) eine Zeile nach der anderen, indem Sie die Zeile in %variable (mehr oder weniger; suchen Sie in einer Eingabeaufforderung nach HELP FOR). Wenn niemand sonst ein Befehlsskript liefert, werde ich es versuchen.

EDIT: mein Versuch, ein cmd.exe-Skript zu erstellen, das die gewünschte Funktion erfüllt:

@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 obige Skript 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|ash|dash|sh|ksh funktioniert:

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

2voto

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

1voto

Adam Rosenfield Punkte 373807

Unter Windows:

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

(Dies ist vielleicht nicht der beste Weg, aber ein Weg, den ich kenne; 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

1voto

Mihai Limbășan Punkte 59901

Beachten Sie jedoch, dass es bei Verwendung der Standard-Dateisysteme sowohl unter Win32 als auch unter *nix keine Möglichkeit gibt, die Atomarität der Operation zu garantieren, d.h. wenn Sie die Existenz der Dateien A, B und C überprüfen, könnte ein anderer Prozess oder Thread die Datei A gelöscht haben, nachdem Sie sie übergeben haben und während Sie nach B und C suchten.

Dateisysteme wie Transaktionelles NTFS kann diese Einschränkung überwinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X