Domanda

Ho un file che elenca i nomi dei file, ognuno sulla propria riga, e voglio testare se ciascuno esiste in una determinata directory. Ad esempio, alcune righe di esempio del file potrebbero essere

mshta.dll
foobar.dll
somethingelse.dll

La directory che mi interessa è X: \ Windows \ System32 \ , quindi voglio vedere se esistono i seguenti file:

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

Come posso farlo usando il prompt dei comandi di Windows? Inoltre (per curiosità) come farei usando bash o un'altra shell Unix?

È stato utile?

Soluzione

In cmd.exe, la FOR / F% variabile IN ( nome file ) DO comando dovrebbe darti quello che vuoi. Questo legge il contenuto di nomefile (e potrebbero essere più di un nome file) una riga alla volta, posizionando la riga in% variabile (più o meno; fai un AIUTO PER in un prompt dei comandi). Se nessun altro fornisce uno script di comandi, tenterò.

EDIT: il mio tentativo di uno script cmd.exe che esegue la richiesta:

@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, lo script sopra deve essere uno script; un ciclo FOR in un file .cmd o .bat, per qualche strana ragione, deve avere un doppio segno di percentuale prima della sua variabile.

Ora, per uno script che funziona con 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

Altri suggerimenti

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)

In Windows:


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

(Questo potrebbe non essere il modo migliore per farlo; è un modo che conosco; vedi anche http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx )

In Bash:


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

Si noti, tuttavia, che utilizzando i file system predefiniti sia in Win32 che * nix non è possibile garantire l'atomicità dell'operazione, ovvero se si verifica l'esistenza dei file A, B e C, alcuni altri processo o thread potrebbero aver eliminato il file A dopo averlo passato e mentre stavi cercando B e C.

I file system come NTFS transazionale possono superare questo limitazione.

Volevo aggiungere un piccolo commento alla maggior parte delle soluzioni di cui sopra. In realtà non stanno testando se un determinato file esiste o meno. Stanno controllando se il file esiste e tu hai accesso ad esso. È del tutto possibile che un file esista in una directory per la quale non si dispone dell'autorizzazione, nel qual caso non sarà possibile visualizzare il file anche se esiste.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top