Como posso testar se uma lista de arquivos existe?
-
02-07-2019 - |
Pergunta
Eu tenho um arquivo que lista nomes de arquivos, cada um sobre a sua própria linha, e eu quero testar se cada existe em um diretório específico. Por exemplo, algumas linhas de amostra do arquivo pode ser
mshta.dll
foobar.dll
somethingelse.dll
O diretório Eu estou interessado é X:\Windows\System32\
, então eu quero ver se existem os seguintes arquivos:
X:\Windows\System32\mshta.dll
X:\Windows\System32\foobar.dll
X:\Windows\System32\somethingelse.dll
Como posso fazer isso usando o Windows prompt de comando? Também (por curiosidade) como eu faria isso usando bash ou outro Unix shell?
Solução
Em cmd.exe, o FOR / F% variável IN ( nome ) DO comando deve dar-lhe o que quiser. Este lê o conteúdo de nome (e eles poderiam ser mais de um nomes de arquivos) uma linha de cada vez, colocando a linha na variável% (mais ou menos; fazer uma ajuda para em um comando prompt). Se há um material de outra pessoa um script de comando, vou tentar.
EDIT: minha tentativa de um script cmd.exe que faz o pedido:
@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
Note, o script acima deve ser um script; um loop FOR em um .cmd ou .bat, por alguma estranha razão, deve ter por cento-sinais duplas antes de sua variável.
Agora, para um script que funciona com o bash | ash | traço | 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
Outras dicas
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)
No Windows:
type file.txt >NUL 2>NUL
if ERRORLEVEL 1 then echo "file doesn't exist"
(Isto pode não ser a melhor maneira de fazê-lo, é uma maneira que eu conheço, ver também http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx )
Em Bash:
if ( test -e file.txt ); then echo "file exists"; fi
Por favor note, no entanto, que o uso de sistemas de arquivos padrão em Win32 e * nix não há nenhuma maneira de garantir a atomicidade da operação, ou seja, se você verificar a existência de arquivos A, B, e C, alguns outros processo ou segmento pode ter excluído arquivo Um depois que você passou e enquanto você estava procurando B e C.
sistemasde arquivo como Transactional NTFS pode superar este limitação.
Eu queria acrescentar um pequeno comentário a maioria das soluções acima. Eles não são realmente testar se um determinado arquivo existe ou não. Eles estão verificando para ver se o arquivo existe e você tem acesso a ele. É perfeitamente possível para um arquivo de existir em um diretório que você não tem permissão para caso em que você não será capaz de visualizar o arquivo mesmo que ele existe.