Как соответствовать * скрытым файлам в каталоге

Вот функция удара, которая добьется цели:

do_rename() {
   oldnum=$1 # assign parameters for clarity
   newnum=$2

   for f in "$oldnum".*; do # get all files matching the old number
       mv "$f" "$newnum"."${foo##*.}" # use a parameter expansion to get the exetension of the current filename
   done
}
22
22.02.2015, 17:51
5 ответов

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

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

или альтернативно

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

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

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

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

Например, самый простой будет просто написать

du -b maybehere*/{.,}*

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


Окончательное слово о расширении скобки.

Расширение скобки - это механизм, с помощью которого вы можете включить дополнительные файлы / строки / что угодно в командную строку, написав меньше символов. Синтаксис {Word1, Word2, ...} , I.E. Это список строк, разделенных запятыми, которая начинается из { и конца с } . Bash Руководство дает очень простое и в то же время очень распространенным примером использования:

$ echo a{b,c,d}e
abe ace ade
24
27.01.2020, 19:42

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

du -b, возможно, * /. *

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

DU -B может быть * /. * /

0
27.01.2020, 19:42

Поскольку вы уже используете специфический синтаксис 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(), что делает его едва ли пригодным для использования.

14
27.01.2020, 19:42

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

find maybehere -maxdepth 1 -exec du -sh {} \;
1
27.01.2020, 19:42

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

du -sm.[!.]* *
10
27.01.2020, 19:42

Теги

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