2014-02-10 2 views
0

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

ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.$/ && $9 !~ /^\.\.$/ { print $1"\t"$9 } ' 

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

ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.{1,2}$/ { print $1"\t"$9 } ' 

К сожалению, второй матч не работает.

Как его определить, чтобы соответствовать одному или двум dot s?

+0

Почему не только используйте 'ls -lA', который будет исключать записи для' .' и '..'? – larsks

+0

Да, всегда лучше использовать команды, которые до сих пор реализованы, но вы должны знать о них ... Спасибо за ответ. Я воспользуюсь вашим предложением, но мне все еще интересно, как мое регулярное выражение должно быть правильно определено для достижения своей цели. – Dominik

+0

обе работы для меня – michaeltang

ответ

0

Ваш второй пример прекрасно работает для меня:

$ /bin/ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.{1,2}$/ {print $1"\t"$9}' 
drwxr-xr-x .git 
drwxr-xr-x .idea 
drwxr-xr-x data 
drwxr-xr-x src 

Когда я смотрел на него сначала, она не работает для меня либо потому, что у меня есть псевдонимы «LS» на «Ls -lF» это означало, что текущий каталог был указан как «./», а родитель был «../», который не соответствовал регулярному выражению, потому что «/» был привязан в конце строки («$» в вашем регулярное выражение). Интересно, возникла ли у вас аналогичная проблема.

+0

Не удалось скомбинировать ls -lF. – Dominik

0

ли вы запустить команду AWK в Solaris, пожалуйста, замените AWK на /usr/xpg4/bin/awk

ls -la | /usr/xpg4/bin/awk '$1 ~ /[d].*/ && $9 !~ /^\.{1,2}$/ {print $1"\t"$9}' 
+0

Я использую Ubuntu. – Dominik

0

Вашего 2-й примера не работает, потому что старше AWK (не гну) AWK версия не поддерживает регулярные выражения шаблона номера, как это:

/\.{1,2}/ 

Однако, чтобы получить список каталогов, вы не должны разбирать вывод ls `s.

EDIT: Для печати скрытых каталогов, но избежать . и .. использовать это:

Вы можете использовать:

printf "%s\n" */ .*[!.]*/ 

Имейте в виде имен файлов/каталогов с новой строкой в ​​них проблематичны.

+0

Из команды awk --version я знаю, что я использую GNU Awk 3.1.8, поэтому согласно вашей информации все должно работать должным образом :) Ваш второй подсказк не соответствует скрытым каталогам:/ – Dominik

+0

см. Обновленный ответ ИЛИ еще попробуйте: 'printf '% s \ n" * /. */'для печати скрытых каталогов. – anubhava

+0

Но использование 'printf '% s \ n" * /. */'Будет печатать". " и ".." каталогов, чего я хочу избежать. – Dominik

0

Вы можете использовать следующую команду, которая не включает в ястреба, но работает хорошо:

ls -ld */ 

или даже лучше

ls -1 -d */ 
+0

Эта команда также не соответствует скрытым каталогам: / – Dominik

0

Просто поместите astarisk *

ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.*$/ {print $1"\t"$9}'