Каков символ *.* названный?

Это должно работать:

DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"

find $DIRS -type f -printf "%T@ %s %p\n" | sort -r -n | while read time bytes filename
do
    rm -fv "$filename"
    DELBYTES=$((DELBYTES + bytes))

    if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done
12
05.04.2014, 21:04
7 ответов
[1122118] Интерпретация [1122586]*.*[1122587] при старых системах Windows/DOS
  • Значение здесь больше связано с Windows/DOS, чем с Unix/Linux. На старых системах Windows/DOS это был шаблон 'wildcard'. Шаблоны Wildcard использовались для сопоставления имён файлов подобно Unix глобусам. Подстановочный символ [1122588]*.*[1122589] обычно использовался для соответствия любому файлу.
  • Как и в Unix-глобусе, [1122590]*[1122591] будет соответствовать любой последовательности символов в имени файла, как например [1122592]*[1122593] сам по себе будет также соответствовать любому файлу. Однако причина, по которой [1122594]*.*[1122595] также будет соответствовать любому имени файла, связана с различиями в работе этих подстановочных знаков. Согласно [1122596]этой статье [1122597]:
  • Любые символы, кроме точки, которые идут после звездочки, не имеют эффекта, так как звездочка перемещает курсор в позицию 12, и в этот момент ничто не меняет состояние разбора, кроме точки, которая очищает последние три позиции и перемещает курсор.
  • Такое поведение (несколько странное с точки зрения Unix) означает, что точка, следующая за [1122600]*[1122601], на самом деле не совпадает с точкой, а просто является хакерским способом, позволяющим добавить больше символов в шаблон. Это означает, что добавление другого [1122602]*[1122603] будет соответствовать чему-либо в этих трех последних позициях.
  • Это имеет немного больше смысла, если учесть, что синтаксис использовался в DOS и старых системах Windows до Windows 95, для чего требовалось [1122604]8.3 имени файла[1122605]. Эти имена файлов могли иметь только одну точку и максимум три символа после точки. Большинство, если не все файлы в системе будут иметь трехсимвольное расширение (даже если технически расширение короче или вообще не разрешено), так что, я думаю, имеет смысл использовать [1122606]*.*[1122607] для соответствия любому файлу (по крайней мере, с искаженной логикой Windowsey).

    Интерпретация [1122608]*.*[1122609] в оболочках Unix

    В оболочках Unix, как другие отмечали, это представляет собой 'расширение патнамента' или 'глобус'. В [1122610]*[1122611] нет никакого странного прыжка в конец и, таким образом, это не приводит к игнорированию следующих за ним символов. Шаблон [1122612]*.*[1122613] будет соответствовать любому имени файла, содержащему точку (за исключением начальной точки). Это определенно не будет соответствовать ни одному файлу, так как в системе Unix/Linux много файлов, которые [1122614]не имеют расширения (или иным образом не содержат точку, так как это тоже разрешено).

    Причина, по которой [1122616]*.*[1122617] не совпадает с точкой в начале имен файлов в Unix, заключается в том, что ставить точку в начале - это то, как файлы "скрыты", а скрытые файлы по умолчанию исключены из глобусов. Чтобы соответствовать им в оболочке POSIX, точка должна быть помещена явно в начало шаблона. В [1122618]bash[1122619] можно установить опцию оболочки [1122620]dotglob[1122621] или установить соответствующую переменную [1122622]GLOBIGNORE[1122623], но это другой вопрос![1122135].

    20
    27.01.2020, 19:54
    [1122037] Это
  • glob
  • in bash, Ниже я цитирую из руководства по bash:
  • bash - GNU Bourne-Again SHell
  • *
  • Совпадает с любой строкой, включая нулевую. Когда опция оболочки глобуса включена, и используется [1123111]*[1123112]. в контексте расширения пути, два соседних [1123113]*s[1123114], используемых как одно целое шаблон будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталоги. Если за ней следует [1123115]/[1123116], то две соседние [1123117]*s[1123118] будут соответствовать только следующим подкаталогам каталоги и подкаталоги.
  • В этом случае [1122513]*.*[1122514] совпадают с любыми файлами, содержащими точку [1122515].[1122516] в его имени.

    Подробнее [1122517]здесь [1122518].[1122044].

    11
    27.01.2020, 19:54
    [1122051] Многие люди из Windows думают, что [1122523]*.*[1122524] предназначено для всех файлов. В Windows так и есть. На UNIX, это все файлы, которые содержат как минимум 1 точку в своем имени. [1122525]*[1122526] само по себе прекрасно работает в Windows (восходит к ранней версии DOS); однако старые учебники опубликованы [1122527]*.*[1122528], и, похоже, трудно сломать эту привычку.[1122052].
    6
    27.01.2020, 19:54

    • *[1122494] - это подстановочный символ, используемый оболочкой для выполнения расширения имени файла
    • , также известного как "глобус". [1122497]*[1122498] расширяется на что угодно, в том числе ничто (например, [1122499]*.*[1122500] не будет совпадать с файлом [1122501].[1122502] и т.д.). Другим распространенным подстановочным знаком является [1122503]?[1122504], который соответствует любому одиночному символу.
    • Не путайте функцию этих подстановочных знаков с использованием одних и тех же символов в регулярных выражениях (таких, как те, которые используются с grep). [1122036]
    4
    27.01.2020, 19:54
    [1125701]То есть [1126166]звезда-точка [1126167] - по крайней мере, в мире DOS (и, конечно же, позже Windows). В DOS точка [1126168].[1126169] имеет особое магическое значение, так как имена файлов - это восьмисимвольная база (позже расширенная, но давайте останемся старой школой) и трехсимвольное расширение (определившее тип файла). В Unix тип файла обычно определяется первыми двумя байтами файла (или иным магическим образом), а расширение является информативным, но не несет особого смысла. За исключением тех случаев, когда все это размыто.
  • Так что в Unix нет никакого особого значения. Звездочка - это "глобусный" символ в оболочках Unix и является подстановочным знаком для любого количества символов (включая ноль). [1126170]? [1126171] - еще один обычный глобусный символ, соответствующий [1126172] точно одному [1126173] любому символу.
  • *.*[1126175] совпадает с любыми именами файлов, которые содержат, по крайней мере, одно [1126176].[1126177]. Оно не имеет специального имени или какого-либо значения больше, чем [1126178]*a*[1126179] или [1126180]*_*[1126181]. И [1126182]*...?[1126183] будут совпадать любые файлы с точкой и ровно одним символом после этой точки. Есть и более сложные расширенные шаблоны глобуса - смотрите страницу man вашей оболочки.
  • В "Новом хакерском словаре" (расширении старого MIT "Jargon File") отмечается, что "звезда" - это наиболее распространенное имя для символа [1126184]*[1126185] (за которым следует [1126186]splat[1126187]), и я думаю, что это все еще верно на практике, и [1126188]. [1126189] определенно обычно является "точкой", поэтому, хотя в качестве конгломерированного символа он не имеет никакого внутреннего особого значения, последовательность все еще разумно называется [1126190]звезда-точка[1126191] на Unix. (Это просто менее полезно.)[1125708]
  • 3
    27.01.2020, 19:54
    [1122075]Здесь на самом деле 2 символа, звездочка [1122541]*[1122542] и точка [1122543].[1122544]. Обычно оболочки интерпретируют звездочку только как любой символ, но в регексе она означает жадный глобус. В этом случае она будет соответствовать всему, что не заканчивается и не начинается с точки, но содержит, по крайней мере, одну:

    hdparm -i /dev/sda
    
    3
    27.01.2020, 19:54

    Теги

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