Come posso verificare se esiste un elenco di file?
-
02-07-2019 - |
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?
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.