Найти все каталоги, содержащие только скрытые файлы и/или скрытые каталоги

Кажется, я нашел решение проблемы получения «даты последнего изменения» с разных серверов, как локальных по отношению к браузеру, так и внешних. Хитрость заключается в объединении SSI (сервера -побочных инструкций )с Javascript в html-документе. Вот код, который я могу вставить практически в любое место документа:

Last modified:
<script language="JavaScript">
var tconfig = '<!--#config timefmt="%m-%d-%Y" --><!--#echo  var="LAST_MODIFIED" -->';
var testlast=document.lastModified;
var tsize=tconfig.length;
if ((tsize > 20) || (tsize < 2))
{ document.write(" "+testlast.substr(0,10)); }
else document.write(" "+tconfig);
</script><br />

Когда сервер извлекает документ, выполняются инструкции SSI, заменяя инструкции результирующим значением. Таким образом, tconfig становится строкой внутри апострофов. Если инструкции SSI не выполняются, сохраняется комментарий, содержащий инструкции, который представляет собой длинную строку. Набор переменных имеет размер строки, который можно проверить при выполнении JavaScript на стороне клиента (в браузере ). Если она находится в разумных пределах, это должна быть «дата последнего изменения», определяемая сервером. Если нет, то Javascript пытается определить это из переменной testlast. Либо выводится подстрока -testlast, ИЛИ выводится значение 'tconfig'. В худшем случае вы получите сегодняшнюю дату из переменной testlast Javascript.

Я использую этот патч во всех своих документах, где я хочу, чтобы отображалось «Последнее изменение :». Кстати, обратите внимание, что я использовал тире в коде SSI и косую черту в коде Javascript (разделитель по умолчанию ). Затем я могу легко определить, какой механизм предоставил значение.

4
15.06.2021, 07:13
2 ответа

Сzsh:

print -rC1 -- **/*(NDF^e['()(($#)) $REPLY/*(NY1)'])

Чтобы исключить каталоги ниже определенной глубины, вы можете исключить их с помощью ~оператора исключения:

set -o extendedglob
print -rC1 -- **/*~*/*/*(NDF^e['()(($#)) $REPLY/*(NY1)'])

однако обратите внимание, что это не помешает zshспуститься в них первым.

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

print -rC1 -- */*(NDF^e['()(($#)) $REPLY/*(NY1)'])

(хотя будьте осторожны, он переходит по символическим ссылкам на глубине 1)

  • print -rC1печать raw on1Cколонка
  • **/*рекурсивная подстановка
  • (...)квалификаторы глобуса
  • N:Nullglob :не жалуйтесь, если совпадений нет
  • D:Dotglob :не игнорировать скрытые файлы
  • F:только Full (по крайней мере с одной записью, отличной от каталогов .и ..).
  • ^:отрицание следующего квалификатора
  • e['code']:eзначение code, чтобы определить, следует ли выбирать файл.
  • ()(($#)) args:возвращает true, если передан хотя бы один аргумент
  • $REPLYвнутри codeсодержит рассматриваемый в данный момент файл.
  • $REPLY/*не -скрытые файлы в$REPLY
  • Y1:остановить после первого найденного файла.
1
28.07.2021, 11:26

Используя findи bash, следующая команда находит все каталоги. Затем он использует bash, чтобы проверить, содержит ли какой-либо из найденных каталогов какие-либо не -скрытые имена. Он делает это, расширяя шаблон глобуса *в каждом каталоге и подсчитывая количество имен, которое получается в результате. Если число равно нулю, выводится путь к каталогу. Шаблон глобуса *по умолчанию не расширяется до скрытых имен.

find. -type d -exec bash -O nullglob -c '
    for dirpath do
        set -- "$dirpath"/*
        [[ $# -eq 0 ]] && printf "%s\n" "$dirpath"
    done' bash {} +

Я устанавливаю параметр оболочки nullglobв сценарии -строки bash -c, чтобы удалить сам шаблон, если совпадений нет.

При использовании /bin/shу вас нет доступа к параметру оболочки nullglob, поэтому вам придется проверить, существует ли на самом деле единственное имя, до которого расширяется шаблон. Если это не так, каталог содержит только скрытые имена.

find. -type d -exec sh -c '
    for dirpath do
        set -- "$dirpath"/*
        [ "$#" -eq 1 ] && [ ! -e "$1" ] && printf "%s\n" "$dirpath"
    done' sh {} +

Если вы хотите избежать нахождения пустых каталогов, добавьте ! -emptyперед -execпервичным find(, предполагая, что ваша реализация findподдерживает этот не -стандарт по общему тесту ).

2
28.07.2021, 11:26

Теги

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