Як перелічити файли, починаючи з "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.