Як шукати всі файли, починаючи з назви "ABC" в каталозі?


58

Мені потрібно шукати файли, починаючи з якогось конкретного імені. Тут може бути декілька файлів, починаючи з певного шаблону, і я хочу перерахувати всі такі файли, що присутні в каталозі.

Відповіді:


60

Щоб заповнити наявні відповіді:

ls

Утиліта списку каталогів за замовчуванням lsможе використовуватися в поєднанні з підстановними символами оболонки. Для пошуку всіх файлів з малюнком abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Зауважте, що розширення файлу також відповідає результатам пошуку.


tree

У випадку, якщо нам потрібно перелічити файли в дереві каталогів, ми також можемо видавати treeпошук за заданою схемою, наприклад:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

У цьому випадку treeсама підтримує макіяж.


2
Чому коли я це роблю ls -l B*, він відображає вміст усіх каталогів, починаючи з, Bа не лише імен відповідних каталогів?
ЕрікЕ

@ErikE Оскільки, коли ви запитуєте lsперерахувати каталог, він відкриває його, це те саме, що робити ls -l BirthdayPhotos. Ви можете придушити таку поведінку за допомогою ls -d B*.
Азор Ахай

@AzorAhai Але чому це трактується B*як специфікація каталогу?
ЕрікЕ

@ErikE Оскільки використання файлу глобус B*розширюється, щоб відповідати всім каталогу, які починаються, Bтому ви дійсно передаєте lsсписок каталогів, тому він відкриває їх усі для вас.
Азор Ахай

1
Не відповідає на запитання. ls -d ABC*було про що запитував автор. Також коментарі в фрагменті коду помилкові, ls abc*перераховано вміст каталогів, починаючи з abc.
greatvovan

42

Ви можете використовувати findкоманду для пошуку файлів з малюнком

find . -type f -name "abc*" 

Наведена вище команда буде шукати файл, який починається з abc, у поточній робочій директорії.

-name 'abc'перерахує файли, які відповідають точності. Напр .: абс

Ви також можете використовувати

 -iname
 -regex 

опція з findкомандою для пошуку імені файлів за допомогою шаблону


7

Існує багато способів зробити це, залежно від того, що саме ви хочете зробити з ними. Як правило, якщо ви хочете просто перерахувати їх, ви можете зробити це в терміналі, використовуючи:

find | grep '^\./ABC'

... і заміни ABCсвого тексту.

Щоб зрозуміти команду, давайте її трохи розбимо:

  • findперелічує всі файли в поточному каталозі та його підкаталогах; тільки використовуючи його, просто перерахуйте все, що там. Зауважте, що findвиводить кожен файл або каталог, починаючи з ./, вказуючи, що їх шлях відносно поточного каталогу. Усвідомлення цього важливо, оскільки це означає, що ми будемо шукати результати, починаючи з того, ./ABCа не тільки ABC.

  • Характер труби |переспрямовує вихід однієї команди на іншу, в цьому випадку вихід з findперенаправляється на grep. Це називається трубопроводом.

  • grepприймає вихідний сигнал і фільтри його , використовуючи даний шаблон, ^\./ABC.

    • Зауважте, що візерунок котирується окремими лапками, ' 'щоб оболонка не інтерпретувала спеціальні символи всередині нього.
  • Тепер сама картина написана в певному синтаксисі називається регулярний вираз , або регулярний вираз для стислості. Regex є надзвичайно потужним інструментом пошуку , якщо ви освоїте його, і є такі сайти, як це які вчать вас про це більш детально, але врахуйте , що grepце не повноцінний движок регулярних виразів , і ви не можете зробити все , що з ним.

  • Для нашої мети:

    • ^у регулярному виразі відповідає початку рядка; це не дозволяє йому відповідати шаблону, якщо він не виникає на початку імені файлу.

    • .у регулярному виразі теж є особливе значення: воно означає "відповідати будь-якому одному символу тут". У випадку, якщо ви хочете використовувати його як буквальну крапку, вам доведеться "втекти" від неї за допомогою зворотної косої риски \перед нею. (Так, узгодження будь-якого персонажа було б нешкідливим у нашому випадку, але я це зробив заради повноти.)


1
Навіщо ви, find | grepколи маєте findсвої ідеально хороші можливості узгодження зразків?
Дараель

3

ви можете використовувати GREP, я думаю, що це найпростіше рішення, ймовірно, також додайте інші параметри grep, щоб зробити матч більш точним

tree | grep ABC

2

Ви можете шукати певний шаблон за допомогою менеджера файлів Nautilus та регулярних виразів.

Для цього натисніть кнопку Вибрати елементи, які відповідають у меню шестірні, як показано нижче (ви також можете натиснути Ctrl+ s).

введіть тут опис зображення

Потім просто введіть регулярний вираз ABC* і підтвердіть.

введіть тут опис зображення

Кожен файл, ім'я якого відповідає вашому шаблону, буде вибрано автоматично.

введіть тут опис зображення

Я використовую Nautilus 3.6. * Від GNOME3 PPA на Ubuntu 12.10 (Quantal).


1

Найлегше для мене рішення

ls | grep PATTERN

Тут ви можете надати будь-який регулярний вираз у ВІДКРИТТІ.

Наприклад, щоб знайти файли з "ab" в будь-якому місці його імені, введіть

ls | grep ".*ab.*"

Щоб знайти файли, що починаються з "ab", введіть

ls | grep "^ab"

1

Якщо ви не знаєте каталог, в якому ABC*знаходяться файли, і у вас мільйони файлів, locateкоманда - це найшвидший метод.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Примітки:

  • Наведена вище команда займає 1 мільйон файлів.
  • Для порівняння, findкоманда, що починається в /кореневому каталозі, буде дуже довго створювати багато помилок дозволу.
  • Якщо файли створені сьогодні, потрібно запустити sudo updatedbспочатку.

0

я використовую

ls | grep abc

або

ls -la | grep abc

Він показує всі файли з abc, а не тільки починаючи з abc. Але, для мене це дійсно простий спосіб.


0

Пітон:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

Це узгодження шаблону, яке закріплено на обох кінцях. Це буде відповідати всім входам файлів, починаючи з "ABC", таких як "ABC", "ABC.txt", "ABC123", але не "xABC". З командного рядка, що використовує 'ls' замість 'printf', тут є безпечною альтернативою, однак залежно від думки, з ким ви погоджуєтесь, 'ls' не є безпечним для використання в сценарії. У такому випадку використання "printf" із узгодженням глобального шаблону вважається безпечним. Якщо ви будете використовувати це в сценарії, вихід 'printf' не буде містити новий символ рядка до кінця вихідного потоку як такого:

printf "%s" /path/to/files/ABC*  

Повернення:

/path/to/files/ABC /path/to/files/ABC123

Якщо вам потрібні розриви рядків після кожного примірника:

printf "%s\n" /path/to/files/ABC*

Повернення:

/path/to/files/ABC 

/path/to/files/ABC123

"/ шлях / до / файлів /" залишається у висновку, якщо ви ввели його таким чином, коли виконували команду "printf". Без нього просто з'являється назва файлу:

printf "%s" ABC* 

Повертається

ABC ABC123

Припустимо, що ви запускаєте команду в каталозі, в якому існують файли.


Це echo /path/to/files/ABC* | tr " " "\n"не гарна ідея. Подумайте, чи є файл /path/to/files/ABC EFG, у назві файлу є пробіл. Ваш trзламається ім'я файлу на дві окремі рядки, яка не є хорошим. Ще гірше, якщо в назві файлу є кілька пробілів. Я б рекомендував використовувати printf "%s\n" ABC*замість цього, що має допомогти з пробілами у назви файлів, але все ж проблематично з іншими спеціальними символами, такими як\n
Сергій Колодяжний,

0

Command-t в одному з моїх улюблених плагінів vim, це плагін на основі рубіну, вище інтеграції з FZF.

За допомогою Comamnd-T і FZF ви можете здійснити пошук за допомогою надзвичайно швидкого "нечіткого" механізму для:

  • Відкриття файлів і буферів
  • Стрибки до тегів та допомоги
  • Запуск команд або попередні пошуки та команди
  • з мінімальною кількістю натискань клавіш.

Як ти бачиш

введіть тут опис зображення

Я завжди шукаю в історії команд, відкриваючи новий термінал і натискаю:

CTRL+R

Крім рекурсивного пошуку у всіх папках, записуючи на будь-яку вкладку терміналу:

fzf

Потім запустіть ім’я файлу

ABC

Також можна писати всередину vim

:CommandT 

Дійсно корисно, особливо у великих папках.


0

Припустимо, що я перебуваю в кореневій директорії, і я хочу лише список каталогу etc: ми пишемо,

find -type d -name "etc"

результат, який ми отримуємо,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Інший приклад,

Також ми можемо написати:

ls | grep "etc"

ми отримуємо,

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