4

На Mac OS X или Linux, есть ли более простая форма команды

find . -name "*substring_of_filename*"

который должен найти все файлы с именами, содержащими substring_of_filename в текущем каталоге (или некотором другом заданном каталоге). Поскольку это обычное дело, есть ли способ сделать команду короче и проще для ввода, возможно, используя псевдоним или функцию в Bash? Или есть какая-то другая простая в вводе команда, которую можно использовать?

Такие как:

findfile . substring_of_filename

(Примечание. Вопрос в том виде, в котором он был изначально написан, использовал app_config в качестве примера substring_of_filename.)

10 ответов10

5

В Mac OS X вы также можете поместить псевдоним с помощью mdfind в .bashrc:

# mdfind uses Spotlight 
alias findf='mdfind -onlyin . -name'

findf app_config
3

Вот ваша функция bash, поместите ее в .bashrc:

function findfiles { find "$1" -iname "*$2*"; }

(Обратите внимание, что -iname делает поиск нечувствительным к регистру. Если вы не хотите этого, используйте -name вместо этого.)

2

Au наоборот! Есть еще более сложный, но тот, который работает:

find . -name "*app_config*"

Точка не нужна для gnu-find:

find -name "*app_config*"

Но вы должны замаскировать звёздочки, иначе они будут интерпретироваться оболочкой, и вы найдете только те имена файлов, которые совпадают с именами в текущем каталоге и соответствуют « app_config ».

1

Поместите это в ваш ~/.profile или ~/.bashrc , не зная , какой Mac использует:

findname () 
{ 
    find . -name "*$1*"
}

затем вызовите функцию по findname name_of_file

если вы хотите использовать несколько слов, вам придется усложнить ситуацию. Самый простой способ, который я могу придумать, заключается в следующем:

findname() 
{ 
    find .|grep $1|grep $2|grep $3|grep $4 
}

Это найдет каждый файл в вашем текущем каталоге, поиск строки 1, затем поиск этого результата для строки 2 и т.д., Пока не дойдет до 4.

0

Вместо того чтобы делать это в скриптах bash, zsh, tcsh, sh и т.д., Я сделал ярлык TextExpander . Я набираю sh≤Space≥ и типы TE

находить . -имя "**"

и помещает курсор между звездочками.

0

Если вы используете bash 4 (с shopt -s globstar) или zsh:

prinftf %s\\n **/*substring_of_filename*
0

На OS X, почему бы просто не использовать locate? Конечно, по умолчанию размещенный файл не обновляется очень часто, но это можно легко изменить (измените периодическое планирование заданий в OS X). locate - это BSDism, не знаю, работает он на Linux или нет.

0

В большинстве дистрибутивов Linux вы можете использовать locate. Например:

$ locate find | grep bin
/sbin/findfs
/usr/bin/find
/usr/bin/find2perl
/usr/bin/findsmb
/usr/bin/gst-typefind-0.10
/usr/bin/memdiskfind
/usr/bin/oldfind
/usr/bin/sane-find-scanner
/usr/include/c++/4.5/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp
0

Ответ - нет". В GNU find нет сокращения "найти файл по имени файла с подстрокой в текущем каталоге или ниже" . Псевдонимы, которые я использую для обхода этого ограничения, следующие (для zsh):

# find file in cwd by [S]ubstring, case [I]nsensitive, change to first sub[D]irectory
finds()   { find .  -name "*$**"; }
findsi()  { find . -iname "*$**"; }
findsid() { cd `find . -iname "*$**" | head -n1 | xargs dirname`; }

Последний мой любимый. Они могут быть использованы следующим образом:

> ls -R
.:
file1  File2  HOLEFILE  test

./test:
hello

(это тестовый каталог)

> findsi file
./HOLEFILE
./File2
./file1

> finds file
./file1

> finds le
./File2
./file1

> findsid ell
> ls
hello
-1

Я думаю, что просто grep может сделать это нормально, не нужно искать. Соответствующие параметры на man-странице:

 -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

 -H, --with-filename
          Print  the  file  name for each match.  This is the default when
          there is more than one file to search.

 -R, -r, --recursive
          Read all  files  under  each  directory,  recursively;  this  is
          equivalent to the -d recurse option.

Обратите внимание, что даже если -H является значением по умолчанию, когда нужно искать более одного файла, я все же предлагаю вам использовать его явно. Этот переключатель решает вашу конкретную проблему, лучше запомнить этот бит непосредственно связанных знаний, чем пограничный случай (поиск по нескольким файлам), когда эта опция используется по умолчанию.

Поэтому версия вашей оригинальной команды grep будет выглядеть так:

grep -lHR app_config .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .