Відповіді:
Щоб заповнити наявні відповіді:
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
сама підтримує макіяж.
ls
перерахувати каталог, він відкриває його, це те саме, що робити ls -l BirthdayPhotos
. Ви можете придушити таку поведінку за допомогою ls -d B*
.
B*
як специфікація каталогу?
B*
розширюється, щоб відповідати всім каталогу, які починаються, B
тому ви дійсно передаєте ls
список каталогів, тому він відкриває їх усі для вас.
ls -d ABC*
було про що запитував автор. Також коментарі в фрагменті коду помилкові, ls abc*
перераховано вміст каталогів, починаючи з abc.
Ви можете використовувати find
команду для пошуку файлів з малюнком
find . -type f -name "abc*"
Наведена вище команда буде шукати файл, який починається з abc, у поточній робочій директорії.
-name 'abc'
перерахує файли, які відповідають точності. Напр .: абс
Ви також можете використовувати
-iname
-regex
опція з find
командою для пошуку імені файлів за допомогою шаблону
Існує багато способів зробити це, залежно від того, що саме ви хочете зробити з ними. Як правило, якщо ви хочете просто перерахувати їх, ви можете зробити це в терміналі, використовуючи:
find | grep '^\./ABC'
... і заміни ABC
свого тексту.
Щоб зрозуміти команду, давайте її трохи розбимо:
find
перелічує всі файли в поточному каталозі та його підкаталогах; тільки використовуючи його, просто перерахуйте все, що там. Зауважте, що find
виводить кожен файл або каталог, починаючи з ./
, вказуючи, що їх шлях відносно поточного каталогу. Усвідомлення цього важливо, оскільки це означає, що ми будемо шукати результати, починаючи з того, ./ABC
а не тільки ABC
.
Характер труби |
переспрямовує вихід однієї команди на іншу, в цьому випадку вихід з find
перенаправляється на grep
. Це називається трубопроводом.
grep
приймає вихідний сигнал і фільтри його , використовуючи даний шаблон, ^\./ABC
.
' '
щоб оболонка не інтерпретувала спеціальні символи всередині нього.Тепер сама картина написана в певному синтаксисі називається регулярний вираз , або регулярний вираз для стислості. Regex є надзвичайно потужним інструментом пошуку , якщо ви освоїте його, і є такі сайти, як це які вчать вас про це більш детально, але врахуйте , що grep
це не повноцінний движок регулярних виразів , і ви не можете зробити все , що з ним.
Для нашої мети:
^
у регулярному виразі відповідає початку рядка; це не дозволяє йому відповідати шаблону, якщо він не виникає на початку імені файлу.
.
у регулярному виразі теж є особливе значення: воно означає "відповідати будь-якому одному символу тут". У випадку, якщо ви хочете використовувати його як буквальну крапку, вам доведеться "втекти" від неї за допомогою зворотної косої риски \
перед нею. (Так, узгодження будь-якого персонажа було б нешкідливим у нашому випадку, але я це зробив заради повноти.)
find | grep
коли маєте find
свої ідеально хороші можливості узгодження зразків?
ви можете використовувати GREP, я думаю, що це найпростіше рішення, ймовірно, також додайте інші параметри grep, щоб зробити матч більш точним
tree | grep ABC
Ви можете шукати певний шаблон за допомогою менеджера файлів Nautilus та регулярних виразів.
Для цього натисніть кнопку Вибрати елементи, які відповідають у меню шестірні, як показано нижче (ви також можете натиснути Ctrl+ s).
Потім просто введіть регулярний вираз ABC*
і підтвердіть.
Кожен файл, ім'я якого відповідає вашому шаблону, буде вибрано автоматично.
Я використовую Nautilus 3.6. * Від GNOME3 PPA на Ubuntu 12.10 (Quantal).
Найлегше для мене рішення
ls | grep PATTERN
Тут ви можете надати будь-який регулярний вираз у ВІДКРИТТІ.
Наприклад, щоб знайти файли з "ab" в будь-якому місці його імені, введіть
ls | grep ".*ab.*"
Щоб знайти файли, що починаються з "ab", введіть
ls | grep "^ab"
Якщо ви не знаєте каталог, в якому 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
Примітки:
find
команда, що починається в /
кореневому каталозі, буде дуже довго створювати багато помилок дозволу.sudo updatedb
спочатку.я використовую
ls | grep abc
або
ls -la | grep abc
Він показує всі файли з abc, а не тільки починаючи з abc. Але, для мене це дійсно простий спосіб.
Пітон:
$ 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 },".")'
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
Command-t в одному з моїх улюблених плагінів vim, це плагін на основі рубіну, вище інтеграції з FZF.
За допомогою Comamnd-T і FZF ви можете здійснити пошук за допомогою надзвичайно швидкого "нечіткого" механізму для:
Як ти бачиш
Я завжди шукаю в історії команд, відкриваючи новий термінал і натискаю:
CTRL+R
Крім рекурсивного пошуку у всіх папках, записуючи на будь-яку вкладку терміналу:
fzf
Потім запустіть ім’я файлу
ABC
Також можна писати всередину vim
:CommandT
Дійсно корисно, особливо у великих папках.
Припустимо, що я перебуваю в кореневій директорії, і я хочу лише список каталогу 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
ls -l B*
, він відображає вміст усіх каталогів, починаючи з,B
а не лише імен відповідних каталогів?