Как я могу проверить, существует ли список файлов?
-
02-07-2019 - |
Вопрос
У меня есть файл, в котором перечислены имена файлов, каждое в отдельной строке, и я хочу проверить, существует ли каждое из них в определенном каталоге.Например, некоторые примерные строки файла могут быть
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?
Решение
В cmd.exe, в ДЛЯ /F %переменная В ( имя файла ) ДЕЛАТЬ команда должен дать тебе то, что ты хочешь.Это читает содержимое имя файла (и это может быть более одного имени файла) по одной строке за раз, помещая строку в переменную % (более или менее;выполните запрос СПРАВКИ в командной строке).Если никто другой не предоставит командный скрипт, я попытаюсь.
Редактировать:моя попытка создать 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
Другие советы
Удар:
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)
В 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)
В Bash:
if ( test -e file.txt ); then echo "file exists"; fi
Пожалуйста, обратите внимание, однако, что при использовании файловых систем по умолчанию как в Win32, так и в * nix невозможно гарантировать атомарность операции, т.е.если вы проверяете наличие файлов A, B и C, какой-либо другой процесс или поток, возможно, удалил файл A после того, как вы передали его и пока вы искали B и C.
Файловые системы , такие как Транзакционные NTFS можно преодолеть это ограничение.
Я хотел бы добавить один небольшой комментарий к большинству вышеперечисленных решений.На самом деле они не проверяют, существует конкретный файл или нет.Они проверяют, существует ли файл и есть ли у вас к нему доступ.Вполне возможно, что файл существует в каталоге, на доступ к которому у вас нет прав, и в этом случае вы не сможете просмотреть файл, даже если он существует.