Как я могу проверить, существует ли список файлов?

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

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?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
31 674
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

В 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

Его file.txt содержит имена файлов, это не тот файл, который он проверяет.

tzot 30.09.2008 01:39

Баш:

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

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

То, что вы говорите, технически правильно; на практике это не имеет значения. Если у меня нет разрешений на чтение / сканирование каталога и поэтому я не могу получить доступ к файлу в нем, чтобы проверить его существование, какая разница в том, что он не существует (для меня)?

tzot 02.10.2008 03:20

for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)

Другие вопросы по теме