LINUX.ORG.RU

История изменений

Исправление Zmicier, (текущая версия) :

Нужно проверить, содержит ли путь к определенным файлам определенные значения (напр. doc). Вывод команды file содержит строки, разделенные двоеточием и состоящие из: полный путь к файлу; описание файла. В цикле, с помощью awk выводим в переменную только путь к файлу.

Нахрена тут awk?

Что вы вообще делаете? Скармливаете список файлов утилите file(1), чтоб не вызывать ее многократно, я так понимаю? В целом разумно, однако:

Во-первых, в выводе file(1) по-умолчанию имя файла и описание разделены не двоеточием, а двоеточием и некоторым количеством пробелов для выравнивания в две колонки, откуда уже стоит заключить, что этот вывод, строго говоря, для чтения человеком, а не машиной. И двоеточие с пробелами — это же не просто вполне допустимая, но и довольно частая последовательность знаков для имени файла. Так что такой вывод разбору не подлежит.

Выравнивание по колонкам отключить почему-то нельзя, но можно поменять разделитель, возьмем хотя бы табуляцию (тоже, разумеется, допустимую в именах, но это уже экзотика):

#!/bin/bash

while IFS=$'\t' read file type; do
    read type <<< "$type"
    if [[ $file == *.txt ]]; then
        ...
    fi
done < \
     <(file --separator $'\t' *)

read type <<< "$type" — это обрезка (trim) пробелов, тех самых, что нельзя убрать.

Исходная версия Zmicier, :

Нужно проверить, содержит ли путь к определенным файлам определенные значения (напр. doc). Вывод команды file содержит строки, разделенные двоеточием и состоящие из: полный путь к файлу; описание файла. В цикле, с помощью awk выводим в переменную только путь к файлу.

Нахрена тут awk?

Что вы вообще делаете? Скармливаете список файлов утилите file(1), чтоб не вызывать ее многократно, я так понимаю? В целом разумно, однако:

Во-первых, в выводе file(1) по-умолчанию имя файла и описание разделены не двоеточием, а двоеточием и некоторым количеством пробелов для выравнивания в две колонки, откуда уже стоит заключить этот вывод он, строго говоря, для чтения человеком, а не машиной. И двоеточие с пробелами — это не просто вполне допустимая, но и довольно частая последовательность знаков для имени файла. Так что такой вывод разбору не подлежит.

Выравнивание по колонкам отключить почему-то нельзя, но хотя бы можно поменять разделитель, возьмем хотя бы табуляцию (тоже, разумеется, допустимую в именах, но это уже экзотика):

#!/bin/bash

while IFS=$'\t' read file type; do
    read type <<< "$type"
    if [[ $file == *.txt ]]; then
        ...
    fi
done < \
     <(file --separator $'\t' *)

read type <<< "$type" — это обрезка (trim) пробелов, тех самых, что нельзя убрать.