2 основных способа:
locate
find
1. Locate
Locate
— самый быстрый способ, т.к. данные ищутся не на диске, а в базе данных /etc/updatedb.conf
. База данных АВТОМАТИЧЕСКИ ОБНОВЛЯЕТСЯ РАЗ В ДЕНЬ. Для того, чтобы обновить базу принудительно:
sudo updatedb
locate: ФОРМАТ КОМАНДЫ
locate option string-to-find
OPTIONS:
- «-i» — case insensitive
2. Find
find: ФОРМАТ КОМАНДЫ
find -[HLP][path-to-file-or-directory][keys][expression]
Простейшая команда find
без ключей отобразит содержание текущей директории аналогично команде ls
!find | head -3
. ./8.Bash_ps.ipynb ./myfile-hardlink
Если аргумент path-to-file-or-directory
опущен, то происходит поиск в текущей директории.
!find [0-2]*.ipynb # если expression ЕДИНСТВЕННЫЙ аргумент, то кавычки можно опустить.
0.Bash_Keyboard_Shortcuts.ipynb 1.Bash_links.ipynb 2.Bash_Wildcards.ipynb
Но !!!!
!find -name '[0-2]*.ipynb' # кавычки!!!
./2.Bash_Wildcards.ipynb ./0.Bash_Keyboard_Shortcuts.ipynb ./.ipynb_checkpoints/1.Bash_links-checkpoint.ipynb ./.ipynb_checkpoints/0.Bash_Keyboard_Shortcuts-checkpoint.ipynb ./.ipynb_checkpoints/2.Bash_Wildcards-checkpoint.ipynb ./1.Bash_links.ipynb
Обратите внимание, что результат поиска разный!
-[HLP] , нужно ли следовать символическим линкам? :
- «-P» — no dereferense, default. «Видит» только линки.
- «-L» — full dereference. Видит линкованные файлы на указанную глубину поиска.
- «-H» — partial dereference. Видит линкованные файлы ТОЛЬКО в папках верхнего уровня, указанных в командной строке.
!find -L . -ls | grep softlink # с ключ -L задает следование линкам
829778 0 -rwxrwxrwx 3 sergey sergey 0 Sep 2 20:56 ./myfile-softlink
!find . -ls | grep softlink # поиск по умолчанию отображает линки "как есть"
788629 0 lrwxrwxrwx 1 sergey sergey 6 Sep 2 20:56 ./myfile-softlink -> myfile
EXPRESSIONS:
ВСЕ выражения указываются отдельно и разделяются пробелами с каждой стороны.
- » » — пробел, булев «and», эквивалент «-a».
- «-o» — булев «or»
- «!» — булев «не», отрицание.
- «–name ‘pattern’» — patern with shell WILDCARDS (*, ?, [ ]) (-name использует shell globbing )
- «*» — один или более знаков
- «?» — один знак
- «[abc]» — один знак из «abc»:
- поддерживает range [a-z]
- поддерживает отрицание [^a-z], эквивалентно [!a-z]
Обратите внимание на особенности использовния ключа -name
:
- -regex pattern» — использовать ERE regexp pattern (иногда необходим дополнительный параметр
-regextype posix-extended
)
!find . -name '*.ipynb' | head -3 # нужны кавычки!!
./8.Bash_ps.ipynb ./.ipynb ./3.Bash_ls.ipynb
!find . -regex '.*\.ipynb' | head -3
./8.Bash_ps.ipynb ./.ipynb ./3.Bash_ls.ipynb
- «±n» :
- " + " -- больше чем n
- " - " -- меньше чем n
- "" -- без знака, точно n
- » -atime ±n » — файлы открывались в последние n-ДНЕЙ
- » -mtime ±n » — файл был изменен в последние n-ДНЕЙ
- » -mmin ±n » — файл был изменен за последние n-МИНУТ
- «–size ±n [ c | k | M | G ]» — файлы заданного размера, где размер указывается в:
- «[c]» — знаках (количество букв, цифр и т.д )
- «[k M G ]» — килобайты, мегабайты, гигабайты
- «–type t» — тип файла, где t — одна буква:
- «f» — файл
- «d» — диретория
- «l» — линк
- «–group g» — выбрать фалы, принадлежащие группе «g»
- «–user u » — то же самое для пользователя
- «–perm mask» — файлы с заданными mask правами доступа
- «–ls » — выдача аналогичная «ls», а не просто список
- «–maxdepth n » — максимальная глубина поиска «n»
- » -exec {} command\; » — исполнить команду
command
, где аргументами будут найденные файлы. После команды должна идти квотруемая точка с запятой » \;»
find
во многом похож на ls
, но отличие от ls
:
- не сортирует найденные файлы
- по умолчанию ищет скрытые файлы
- по умолчанию ищет файлы рекурсивно
- имеет больше параметров для выбора нужных файлов
- позволяет в рамках одной программы
find
задать действия, которые нужно произвести над выбранным файлами с помощью ключа-exec
!find . -ls | sort -k 11 | head -3
876005 4 drwxrwxr-x 3 sergey sergey 4096 Sep 4 20:08 . 829784 4 -rw-rw-r-- 1 sergey sergey 2293 Sep 3 11:52 ./0.Bash_Keyboard_Shortcuts.ipynb 829779 4 -rw-rw-r-- 1 sergey sergey 3627 Sep 2 21:09 ./1.Bash_links.ipynb
Wildcards и regex по-разному ищут соответствия в названиях файла:
- wildcards (ключ
-name
): паттерн должен содержаться в имени файла (соответствует логике AWK) - regex (ключ
-regex
): паттерн должен В ТОЧНОСТИ СООТВЕТСТВОВАТЬ найденному названию файла
!find . -name 'myfile*' # wildcards
./myfile-hardlink ./myfile-softlink ./myfile
!find . -name '*link' # wildcards
./myfile-hardlink ./hard-link ./myfile-softlink
!find . -regex '\./myfile.*' # regex
./myfile-hardlink ./myfile-softlink ./myfile
!find . -regex '.*\(link\)$' # regex
./myfile-hardlink ./hard-link ./myfile-softlink
!find . -regextype posix-extended -regex '.*(link)$' # regex
./myfile-hardlink ./hard-link ./myfile-softlink
AWK файлы так же, как и wildcards (ключ -name
): для того, чтобы AWK нашел строку с данным файлом, Достаточно, чтобы паттерн СОДЕРЖАЛСЯ в имени файла
!ls . | awk '/myfile/' # сравни с предыдущим find
myfile myfile-hardlink myfile-softlink
!find . -type f -size +1k
./2.Bash_Permissions_and_Ownership.ipynb ./3.Bash_Search_for_files.ipynb ./1.Bash_links.ipynb
!find . -mtime +1
!find . -type d -mtime -1 -ls
876005 4 drwxrwxr-x 3 sergey sergey 4096 Sep 3 11:06 . 899419 4 drwxr-xr-x 2 sergey sergey 4096 Sep 2 23:01 ./.ipynb_checkpoints
!find . -type d -regex '.*/.ipynb.*'
./.ipynb_checkpoints
!find . -type d -regex '.*/.ipynb.*' -exec ls {} \;
0.Bash_Keyboard_Shortcuts-checkpoint.ipynb 1.Bash_links-checkpoint.ipynb 2.Bash_Wildcards_Globbing_Extended_Globbing-checkpoint.ipynb 3.Bash_ls-checkpoint.ipynb 4.Bash_Permissions_and_Ownership-checkpoint.ipynb 5.Bash_Search_for_files-checkpoint.ipynb 7.Bash_file-checkpoint.ipynb 8.Bash_ps-checkpoint.ipynb
Write a comment: