У меня есть файл, в котором перечислены имена файлов, каждое в отдельной строке, и я хочу проверить, существует ли каждое в определенном каталоге. Например, некоторые примерные строки файла могут быть
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?





В Windows:
type file.txt >NUL 2>NUL
if ERRORLEVEL 1 then echo "file doesn't exist"
(This may not be the best way to do it; it is a way I know of; see also http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx)
В Баше:
if ( test -e file.txt ); then echo "file exists"; fi
Баш:
while read f; do
[ -f "$f" ] && echo "$f" exists
done < file.txt
Однако обратите внимание, что при использовании файловых систем по умолчанию как в Win32, так и в * nix нет способа гарантировать атомарность операции, т.е. если вы проверяете наличие файлов A, B и C, какого-либо другого процесса или потока могли удалить файл A после того, как вы его передали, и пока вы искали B и C.
Файловые системы, такие как Транзакционная NTFS, могут преодолеть это ограничение.
В cmd.exe FOR / F%ПеременнаяВ (имя файла) ДЕЛАТЬкоманда должен дать вам то, что вы хотите. Это считывает содержимое имя файла (и это может быть более одного имени файла) по одной строке за раз, помещая строку в переменную% (более или менее; выполните 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
Я хотел добавить один небольшой комментарий к большинству вышеперечисленных решений. На самом деле они не проверяют, существует ли конкретный файл или нет. Они проверяют, существует ли файл и есть ли у вас к нему доступ. Вполне возможно, что файл существует в каталоге, на который у вас нет разрешения, и в этом случае вы не сможете просмотреть файл, даже если он существует.
То, что вы говорите, технически правильно; на практике это не имеет значения. Если у меня нет разрешений на чтение / сканирование каталога и поэтому я не могу получить доступ к файлу в нем, чтобы проверить его существование, какая разница в том, что он не существует (для меня)?
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)
Его file.txt содержит имена файлов, это не тот файл, который он проверяет.