Нечитаемая строка соответствует регулярному выражению, состоящему только из читаемых символов

Делаем несколько предположений:

  • Удаленное имя файла такое же, как и локальное имя файла / символическая ссылка
  • Все локальные файлы находятся в одном каталоге
  • Все удаленные файлы находятся в одном каталоге

Вы затем может перечислить удаленные файлы и удалить те, для которых нет локального файла или символической ссылки. Что-то вроде этого может сработать

#!/bin/bash
#
rmt=/path/to/sshfs/storage
lcl=/path/to/local/storage

for itempath in "$rmt"/*.ts
do
    itemfile="${itempath/*\/}"
    if test ! -h "$lcl/$itemfile"
    then
        echo "Removing remote $itemfile with no local symlink" >&2
        rm -f "$itempath"
    fi
done

Если вы просто хотите удалить все локальные висячие символические ссылки в определенном каталоге, вы можете несколько упростить код:

#!/bin/bash
#
lcl=/path/to/local/storage

for item in "$lcl"/*.ts
do
    if test -h "$item" -a ! -e "$item"
    then
        echo "Removing dangling symlink $item" >&2
        rm -f "$item"
    fi
done
1
18.08.2017, 15:29
1 ответ

Какие диапазоны, такие как AZили а-я, не указаны в POSIX, кроме как в локали POSIX (для AZ, а не а- яочевидно).

Только в локали POSIX вы можете получить гарантию того, что [A-Z]соответствует только символам ABCDEFGHIJKLMNOPQRSTUVWXYZ.

В других локалях поведение зависит от реализации. Некоторые могут совпадать по любому элементу сортировки (могут быть символами или последовательностями символов), который сортируется после Aи перед Z(может включать ch, x или Á, но не Ź, например), или они могут совпадать с символами, кодовая точка которых больше, чем у A, и меньше этой Zв кодировке локали, или они могли бы использовать данные сопоставления локали еще по-другому... Также обратите внимание, что не все согласны с порядком букв для любого данного алфавита (например, латиницы или кириллицы в в этом случае), поэтому вы получите различное поведение для разных локалей, которые включают эти скрипты в свой набор символов (даже если это один и тот же набор символов)).

Если вы хотите сопоставить любой буквенный символ в любом сценарии, используйте [[:alpha:]], если вы хотите сопоставить диапазоны символов на основе кодовой точки в UTF-8, вы можете попробовать использовать локаль C.UTF-8, доступная во многих системах.

Если вы хотите сопоставить любую букву латинского алфавита, вы можете использовать perlили pcre's \p{Latin}(включает é, Ê...).В zsh:

set -o rematchpcre
[[ $x =~ '^(\p{Latin}|\p{Cyrillic})$' ]]

Вы можете ограничить латинские буквы теми, которые встречаются только в ASCII с помощью (по-прежнему с zshи по-прежнему с rematchpcre):

[[ $x =~ '^((?=[[:ascii:]])\p{Latin}|\p{Cyrillic})$' ]]

хотя в действительности с rematchpcre, ^([a-zA-Z]|\p{Cyrillic})$будет иметь тот же эффект, что и диапазоны в PCRE и в zshоснованы на значении кодовой точки, и эти буквы гарантированно имеют одинаковые кодовые точки и находятся в этой последовательности английского алфавита со всеми локалями, по крайней мере, в системах POSIX на основе ASCII и EBCDIC.

Или вы можете указать символы явно, если вам нужно только подмножество, чтобы избежать двусмысленности:

[[ $x =~ ^[ABC...XYZabc...xyzабв...эюя]$ ]]

Вы всегда можете сохранить их в переменных, таких как:

ascii_upper=ABC...XYZ
ascii_lower=abc...xzy
cyr_upper=...
[[ $x =~ ^[$ascii_upper$ascii_lower$cyr_upper...]$ ]]
4
27.01.2020, 23:18

Теги

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