Как сопоставить * со скрытыми файлами внутри каталога

21

Как сопоставить скрытые файлы внутри данных каталогов

например

Если я дам команду ниже, это не даст результат скрытых файлов,

 du -b maybehere*/*

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

du -b maybehere*/.* maybehere*/*

как мне нужно напечатать, может быть, здесь дважды.

Vidhan
источник
Попробуй только что скрытый maybehere*/.*и добавь к вышесказанному для всех
Костас
1
Ваше редактирование создает новый вопрос с дополнительными ограничениями, который превращает Q в движущуюся цель, что может сделать недействительным уже полученный ответ. Это плохие манеры, просто задайте новый вопрос, если он у вас есть.
Anthon

Ответы:

22

Воспользуйтесь расширением скобок:

du -b maybehere*/{*,.[^.],.??*}

или в качестве альтернативы

du -b maybehere*/{,.[^.],..?}*

Логика этого, вероятно, не очевидна, поэтому вот объяснение:

  • * соответствует всем не скрытым файлам
  • .[^.]сопоставляет файлы, имена которых начинаются с одной точки, за которой не следует точка; это только 2-х символьные имена файлов в первой форме.
  • .??* соответствует скрытым файлам длиной не менее 3 символов
  • ..?* как и выше, но второй символ должен быть точкой

Весь смысл в том, чтобы исключить жесткие ссылки на текущий и родительский каталог ( .и ..), но включить все обычные файлы таким образом, чтобы каждый из них был засчитан только один раз!

Например, самым простым было бы просто написать

du -b maybehere*/{.,}*

Это означает, что список содержит точку .и «ничто» (ничто не находится между ,и закрывается }), поэтому все скрытые файлы (которые начинаются с точки) и все не скрытые файлы (которые начинаются с «ничего») будут совпадать. Проблема в том, что это также будет соответствовать .и .., и это, скорее всего, не то, что вы хотите, поэтому мы должны как-то исключить это.


Последнее слово о расширении скобок.

Расширение скобок - это механизм, с помощью которого вы можете добавить больше файлов / строк / чего угодно в командную строку, написав меньше символов. Синтаксис {word1,word2,...}, то есть это список строк, разделенных запятыми, который начинается {и заканчивается на }. bashРуководство дает очень простой и в то же время очень распространенный пример использования:

$ echo a{b,c,d}e
abe ace ade
jimmij
источник
какая польза от этого { }я понятия не имею :( можете ли вы дать мне направление, чтобы получить больше информации об этом
Vidhan
@vidhan посмотрите правку и посмотрите man bashглаву «Расширение скобок ».
Джимми
не могли бы вы дать мне более подробное объяснение вышеизложенного, чуть более четко объясняя, как все работает, когда я новичок в этих вещах @jimmij
vidhan
6
.??*не соответствует .a, .b... .[^.]*не соответствует ..foo.
Стефан Шазелас
4
.fooсоответствует как .[^.]*и .??*. Вы хотите {.[!.],..?,}*.
Стефан Шазелас
14

Поскольку вы уже используете специальный синтаксис GNU ( -b):

du -abd1 maybehere*/

Таким образом, это duсписок файлов в maybehere*каталогах (и это не исключает точечные файлы). -d1ограничивает отчеты об использовании диска на один уровень ниже (включая не каталоги с -a).

В противном случае для включения в глобусы скрытых файлов (кроме .и ..) каждая оболочка имеет собственный синтаксис:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    хотя остерегайтесь, что он включает .и ..в системах, которые включают их, в результате readdir() чего его вряд ли можно использовать.

Стефан Шазелас
источник
8

Другой вариант доступен здесь :

du -sm .[!.]* *
Фабиу
источник
Почему вы хотите пропустить имена файлов, начинающиеся с ..?
Кусалананда
2
Предположительно, потому что они не хотят перечислять все в ../и ниже.
Шадур
Это не считает файлы как например ..myfile; добавить ..?*за это. Но +1 за использование правильного синтаксиса glob для отрицательных совпадений.
Педро Гимено
0

Если вы хотите просто перечислить скрытые каталоги или работать со скрытыми каталогами, то, как сказал Костас, вы можете использовать

du -b maybehere*/.*

Это позволит вам работать со скрытыми файлами и каталогами. Если вам нужны только скрытые каталоги, вы можете указать это с помощью

du -b maybehere*/.*/

SailorCire
источник
не могли бы вы еще раз увидеть вопрос @SailorCire Я немного его отредактировал
vidhan
@vidhan, так что вы хотите работать только со скрытыми внутри одного каталога? Это верно?
SailorCire
нет Я хочу сопоставить как скрытые, так и не скрытые файлы в одном каталоге, вместо того, чтобы использовать как du, так maybehere*/.*и maybehere*/*один из скрытых, а другой - для скрытых
vidhan
@vidhan du -bподбирает как скрытые, так и не скрытые.
SailorCire
нет :( к сожалению @SailorCire
vidhan
0

Хотя это и не оболочка напрямую, вы можете использовать find с ограниченной глубиной, как это

find maybehere -maxdepth 1 -exec du -sh {} \;
K3A
источник