Делаем несколько предположений:
Вы затем может перечислить удаленные файлы и удалить те, для которых нет локального файла или символической ссылки. Что-то вроде этого может сработать
#!/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
Какие диапазоны, такие как 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...]$ ]]