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?

Foi útil?

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.

sistemas

de 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top