Можно ли выполнить поиск комбинации каталога / файла?

На самом деле, на картинке нет каких-либо штриховых символов. Выполнение сброса (обычно) помогает с , что .Но reset также восстанавливает режимы терминала, что несколько более надежно, чем stty sane :

  • Если вы используете stty sane , это устранит проблемы с режимами терминала. для эха и возврата каретки, но на платформах Unix (например, AIX, HPUX и Solaris), который устанавливает для символа стирания значение, которое вам, вероятно, не нужно, например ^? или # вместо ^ H .
  • Команда reset (по крайней мере, предоставляемая ncurses) улучшает эти настройки и отправляет строку инициализации терминала. Этот обычно сбрасывает альтернативный набор символов (но некоторые терминалы могут отличаться, поскольку это также функция, иногда упускаемая из виду в описаниях терминалов Unix).

Если бы вы показали символы рисования линий, это, вероятно, было бы из-за наличия управляющего символа смещения (не escape-последовательности):

SO        Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This
          invokes the G1 character set.

Вот снимок экрана, показывающий символы рисования линий, который я сделал

ls
tput smacs
ls -l

enter image description here

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

  • не все символы печатаются (обратите внимание на большие пустые области на картинке), и
  • некоторые последовательности байтов не образуют допустимого UTF-8, и отображаются эмуляторами терминала со специальными метками, например, символом замены Unicode .

Дополнительная информация:

12
07.04.2019, 17:38
2 ответа

Здесь полезен предикат -path:

find. -path '*/ABC_MPSC/ABC.jpg'

Описание POSIXдля этого предиката:

The primary shall evaluate as true if the current pathname matches pattern using the pattern matching notation described in Pattern Matching Notation. The additional rules in Patterns Used for Filename Expansion do not apply as this is a matching operation, not an expansion.

Причина, по которой ваш -name "ABC_MPSC/ABC.jpg"не удался, заключается в том, что предикат -name:

shall evaluate as true if the basename of the current pathname matches pattern

Другими словами, -nameникогда не видит каталог текущего имени файла, только само базовое имя файла (ABC.jpg, например ).

17
27.01.2020, 19:54

Два способа (помимо с использованием-path):

  1. Найдите каталог, затем определите файл:

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    Это зависит от реализации findдля расширения {}до текущего имени пути к найденному каталогу, даже несмотря на то, что он объединен с/ABC.jpg(это не требуется для этого ). Его также можно записать как

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Найдите файл, затем проверьте имя его родительского каталога:

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

Обе эти альтернативы будут медленнее, чем использование -path, как показывает Джефф. Тем не менее я оставляю их здесь в качестве примеров, так как они могут быть адаптированы для других целей.

10
27.01.2020, 19:54

Теги

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