Показать имена файлов, которые не совпали в цикле while

Проблема решилась отключением дополнительных мониторов. Загрузка только с одним подключенным монитором решает проблему.

0
10.12.2019, 16:29
4 ответа

Использованиеgrep(для файлов в текущей папке, при условии, что их имена не содержат символов новой строки)):

$ grep -v -i -F -x -f <(printf '%s\n' *) files.txt
file4

Опции:

  • -vинвертировать совпадение, выбрать не совпадающие -строки
  • -fprintf '%s\n' *перечисляет файлы в текущем каталоге и используется в качестве входного файла шаблона для grep.
  • -Fинтерпретировать шаблоны как фиксированные строки (вместо регулярных выражений)
  • -xсовпадение целых строк
  • -iсовпадение без учета регистра (как для вашего-iname).
2
28.01.2020, 02:17

Вы можете сделать это вместо использования find, если глубина равна одному каталогу:

while IFS= read -r file; do 
  [[ -f "${file}" ]] && echo "${file} exists" \
  || echo "$file doesn't exist"; 
done < files.txt
0
28.01.2020, 02:17

Вы можете запустить этот фрагмент из командной строки, чтобы увидеть несуществующие файлы:

$ < files.txt xargs ls -lLd > /dev/null

Существующие файлы не будут отображаться, так как они будут поглощены пустой корзиной, тогда как, поскольку мы не перенаправили stderr, несуществующие файлы будут показаны на терминале.

0
28.01.2020, 02:17

Использование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к этой команде.

2
28.01.2020, 02:17

Теги

Похожие вопросы