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

StackOverflow https://stackoverflow.com/questions/150762

  •  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 можно преодолеть это ограничение.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top