Как исключить каталоги из 'ls-R' вывод?

Может быть, это может помочь, но это столбец 1 всегда 2, а результаты зависят от него?

awk '{ map[$2] += $3 + $4; } END { for (i in map) { print "2", i, map[i] | "sort -t't'" } }' file

или как упомянуто Glenn Jackman в комментариях о сортировке:

gawk '{ map[$2] += $3 + $4; } END { PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in map) { print 2, i, map[i] } }' file

]

-1
02.05.2014, 02:09
4 ответа

Первая отправленная вами команда не может дать результаты, которые вы показываете, потому что у них нет двоеточий в конце; по-видимому, вы их раздели. Сценарий, на который вы ссылаетесь, делает это для выбора путей к каталогам, которые ls -R отображаются с добавленным двоеточием, но ничто не препятствует тому, чтобы имя файла и путь заканчивались двоеточием и давали ложное срабатывание. Это также вводит в заблуждение ваш заголовок; вы хотите сохранить большинство каталогов и исключить только несколько.

Заданный вопрос: Существует несколько различных «разновидностей» (стандартов) регулярных выражений, наиболее похожих, но с важными различиями в деталях. Есть два общих принципа в программном обеспечении Unix и Unix: простое регулярное выражение (BRE) и расширенное регулярное выражение (ERE). В большинстве оболочек (и стандартном поиске) используется еще более простая форма для сопоставления имен файлов (и вариантов регистра) (только? * И [...]), которая даже не называется регулярным выражением, а просто шаблоном. Существует еще более расширенная форма, определенная Perl, но используемая вне ее, называется Perl Compatible Regular Expression (PCRE). См. Почему мое регулярное выражение работает в X, но не в Y? и http://en.wikipedia.org/wiki/Regular_Expression .

Ваш (?! "взгляд вперед" есть только в PCRE, тогда как стандартный grep по умолчанию выполняет BRE или ERE с -E , хотя он кажется версии grep могут выполнять PCRE, или вы можете получить и установить отдельный pcregrep . Но вам это не нужно. Если вам нужны не скрытые дочерние элементы curr dir, просто выполните '^ \ ./ \ w' или '^ \ ./ [^.]' в зависимости от того, насколько строгими вы хотите быть. Но вы говорите, что не хотите скрытый каталог в любом месте пути, что труднее сделать с положительным регулярным выражением и намного проще с отрицательным соответствием, например grep -v '/\.'.

Обратная косая черта является особенной в обоих bash (и большинство, если не все оболочки) и grep (BRE или ERE), поэтому они должны быть либо удвоены \\ , либо заключены в одинарные кавычки; я предпочитаю последнее. Обратите внимание, что двойных кавычек здесь недостаточно.

Лучшие подходы: на самом деле вам нужны только пути к каталогам, поэтому, как предлагают другие ответы find -type d | grep -v / \. - лучший подход. Это не тратит время на перечисление имен обычных файлов, которые вы затем отбрасываете. В качестве альтернативы вы можете просто использовать ls -R | grep: $ без -a ; по умолчанию ls уже пропускает скрытые записи (как обычные файлы, так и каталоги). Как это делает сценарий, на который вы ссылаетесь!

2
28.01.2020, 05:06
[113084] Поскольку вы ищете что-то, что печатает дерево каталогов, почему бы просто не использовать дерево Стива Бейкера [113491]-[113492]? (Это тот, который большинство дистрибутивов включают в свои репозитории.)

/bin
/sbin
/usr
/lib
/opt (if you have it)
/etc

Вы должны взглянуть на его manpage, но это может заставить вас начать:

(включать точечные файлы/директории, исключать все, что содержит '.git')[113089].

2
28.01.2020, 05:06

Вам действительно следует использовать file для более глубокого опроса содержимого каталога, чем то, что предоставляет вам 'ls -l'.

find . -type f

Команда find является древней магией юникса. Она избавит вас от бесконечных регексуальных споров.

3
28.01.2020, 05:06

Чтобы расширить то, что говорит @dan-garthwaite, find обычно используется при поиске деревьев каталогов. Общий синтаксис:

find /path/to/search [one or more expressions]

See the man page for all possible expressions, but some handy ones are:

-type x         # Where x = f for files, d for directories, s for sockets, etc.
-mtime x        # Where x = number of minutes since the file was last accessed
-name pattern   # Where pattern = a string to search for (use * for wildcard match)
-iname pattern  # Same as -name, but case insensitive
-size x         # Where x = size, human readable (eg. 500k, 20m, ...)
-user name      # Where name = owner of file

So, например, для поиска в /home всех jpg файлов, принадлежащих bob и превышающих 5 МБ, можно запустить:

find /home -user bob -size +5m -iname '*.jpg'
1
28.01.2020, 05:06

Теги

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