Як перелічити файли, починаючи з "a" або "c" від / etc. [зачинено]


10

Я спробував, ls /etc/[ac]*але він показує каталоги, що починаються з a або c , і весь їхній вміст, а не файли, що починаються з " a " або " c ".


каталоги - один із багатьох типів файлів . Які типи файлів вас цікавлять (звичайні, символьна посилання, пристрій, труба, сокет ...)?
— Стефан Шазелас

Незрозуміло, чи ви за "каталогом" говорите про вміст каталогів, чи про самі назви каталогів. Команда, яку ви показуєте, містила б список вмісту каталогів, що відповідає шаблону, при цьому ls -d /etc/[ac]*ви не отримали б вміст відповідних каталогів, але все одно побачили б імена каталогів. Незрозуміло, це саме те, що ви хочете, чи ви хочете уникати навіть переліку імен каталогів.
— Kusalananda

Відповіді:


23

Щоб уникнути перерахування вмісту каталогів, ви можете:

ls -d /etc/[ac]*

Це список списків імен каталогів разом із звичайними іменами файлів, що починаються з aабо c.

Для повноти рішення, яке не стосується, findможе бути:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

Моє первинне прочитання питання також ls -dздавалося доречним, але, здається, що в початковому питанні вказано, що жодні каталоги не повинні бути перелічені, незалежно від розширення чи нерозширення.
— Кріс Даун

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9не розбирайте ls.
— Авінаш Радж

1
@AvinashRaj: Ну, актуальність цієї поради залежить від того, чи потрібно це рішення працювати один раз чи назавжди. Якщо тільки один раз, то розбір ls- це чесна гра, на мою думку.
— Грег Хьюгілл

3
У нього є пункт. Незважаючи на те, що імена в /etcімовірності будуть здоровими, простий пробіл порушить lsпідхід, оскільки зміниться кількість полів. +1, ls -ldхоча
— тердон

1
Вам також потрібно виправити locale ( LC_ALL=C), дата не гарантовано містить 3 поля в інших мовах.
— Стефан Шазелас

7

Рекурсивно:

find /etc -type f -name '[ac]*'

Якщо вам потрібна нерекурсія, ви можете це зробити портативно:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Або це, що не має портативного зв’язку (GNU або нещодавнє BSD):

find /etc -type f -maxdepth 1 -name '[ac]*'

Якщо ви хочете робити цю справу нечутливо, використовуйте -inameзамість цього -name.


1
Зверніть увагу, що -type fце для звичайних файлів . Якщо вам потрібні файли без каталогу, замініть ! -type d(або ! -xtype dGNU, findякщо ви також хочете виключити посилання на каталоги).
— Стефан Шазелас

1

Ви можете також спробувати цю команду,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'

1

Якщо ви хочете як директори (не вміст каталогу), так і файли, ви можете використовувати printfbultin:

printf "%s\n" [ac]*

Приклад:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

Як це дозволить уникнути каталогів, як вимагається у запитанні?
— Кріс Даун

О, моє неправильне прочитання. Я думаю, що ОП хочу каталог, але не його зміст.
— cuonglm

Вибачте за цю редакцію, зовсім непрочитано.
— тердон

1

Без рекурсивного без find:

ls -pd /etc/[ac]* | grep -v '/$'

-pдодає /в кінці для каталогів, яку grepвідфільтровує. Звичайно, не працює для імен файлів, які містять спеціальні символи, такі як нові рядки.


1

З zsh:

print -rl /etc/[ac]*(.)

Буде перелічено звичайні файли (як -type fу find), зазначені в /etcімені, яке починається з aабо c. (xxx)Частина в кінці Глоб є ЗШ-специфічна особливість називається підстановкою класифікатора. .як глобальний класифікатор означає звичайний файл .

Якщо глобус не відповідає, zshскасує команду. Зауважте, що в інших оболонках, схожих на Борна, якщо глобус не відповідає, шаблон розширюється до себе, тому ls -d /etc/[ac]*може неправильно перелічити файл, який називається, /etc/[ac]*якщо файл не починається з aабо cв /etc.

print -rl /etc/[ac]*(^/)

перерахував би файли, що не є типом каталогу та

print -rl /etc/[ac]*(-^/)

перерахував би файли, які не є типом каталогу після вирішення символьних посилань.


-3

Для відображення файлів, що починаються з:

ls etc |  grep ^a

Для відображення файлів, що починаються з c:

ls etc |  grep ^c
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.