Как я могу проверить, существует ли список файлов? - PullRequest
7 голосов
/ 30 сентября 2008

У меня есть файл, в котором перечислены имена файлов, каждое в отдельной строке, и я хочу проверить, существует ли каждое из них в определенном каталоге. Например, некоторые примеры строк файла могут быть

mshta.dll
foobar.dll
somethingelse.dll

Интересующий меня каталог - X:\Windows\System32\, поэтому я хочу посмотреть, существуют ли следующие файлы:

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

Как я могу сделать это с помощью командной строки Windows? Также (из любопытства), как бы я сделал это, используя bash или другую оболочку Unix?

Ответы [ 6 ]

9 голосов
/ 30 сентября 2008

В cmd.exe переменная FOR / F% IN ( имя файла ) DO команда должна дать вам то, что вы хотите. Это читает содержимое имя файла (и они могут быть более одного имени файла) по одной строке за раз, помещая строку в переменную% (более или менее; выполните HELP FOR в командной строке). Если никто не предоставит командный скрипт, я попытаюсь.

РЕДАКТИРОВАТЬ: моя попытка сценария cmd.exe, который выполняет запрошенный:

@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

Обратите внимание, скрипт выше должен быть скриптом; По какой-то странной причине цикл FOR в файле .cmd или .bat должен иметь двойные знаки процента перед своей переменной.

Теперь для скрипта, который работает с 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
9 голосов
/ 30 сентября 2008

Bash:

while read f; do 
    [ -f "$f" ] && echo "$f" exists
done < file.txt
2 голосов
/ 30 сентября 2008
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)
1 голос
/ 30 сентября 2008

Я хотел бы добавить один небольшой комментарий к большинству из перечисленных решений. На самом деле они не проверяют, существует ли определенный файл или нет. Они проверяют, существует ли файл и есть ли у вас к нему доступ. Вполне возможно, что файл будет находиться в каталоге, к которому у вас нет разрешения, и в этом случае вы не сможете просмотреть файл, даже если он существует.

1 голос
/ 30 сентября 2008

Обратите внимание, однако, что при использовании файловых систем по умолчанию под Win32 и * nix нет способа гарантировать атомарность операции, т.е. если вы проверяете наличие файлов A, B и C, некоторые другие процесс или поток могли удалить файл A после того, как вы его передали и искали B и C.

Файловые системы, такие как Транзакционная NTFS , могут преодолеть это ограничение.

1 голос
/ 30 сентября 2008

В Windows:


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

(Возможно, это не лучший способ сделать это; я знаю об этом; см. Также http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx)

В Баш:


if ( test -e file.txt ); then echo "file exists"; fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...