Проблема решилась отключением дополнительных мониторов. Загрузка только с одним подключенным монитором решает проблему.
Использованиеgrep
(для файлов в текущей папке, при условии, что их имена не содержат символов новой строки)):
$ grep -v -i -F -x -f <(printf '%s\n' *) files.txt
file4
Опции:
-v
инвертировать совпадение, выбрать не совпадающие -строки -f
printf '%s\n' *
перечисляет файлы в текущем каталоге и используется в качестве входного файла шаблона для grep
. -F
интерпретировать шаблоны как фиксированные строки (вместо регулярных выражений)-x
совпадение целых строк -i
совпадение без учета регистра (как для вашего-iname
). Вы можете сделать это вместо использования find
, если глубина равна одному каталогу:
while IFS= read -r file; do
[[ -f "${file}" ]] && echo "${file} exists" \
|| echo "$file doesn't exist";
done < files.txt
Вы можете запустить этот фрагмент из командной строки, чтобы увидеть несуществующие файлы:
$ < files.txt xargs ls -lLd > /dev/null
Существующие файлы не будут отображаться, так как они будут поглощены пустой корзиной, тогда как, поскольку мы не перенаправили stderr, несуществующие файлы будут показаны на терминале.
Использованиеfind
:
while IFS= read -r name; do
if [ -z "$(find. -iname "$name")" ]; then
printf 'Not found: %s\n' "$name"
fi
done <files.txt
Этот цикл будет считывать имя файла за раз из файла files.txt
и будет искать это имя во всей иерархии ниже текущего каталога, без учета регистра -. Если имя не найдено,(find
ничего не выводит ), отображается соответствующее сообщение.
Если вы хотите убедиться, что команда find
ищет только обычные файлы (, а не каталоги и т. д. ), добавьте -type f
к этой команде.