Я выполняю команду для поиска фразы во всех файлах:
cat *.* | grep blabla
Это хорошо работает, но я получил проблему со скрытыми файлами и каталогами. Команда просто не имеет дело с ними. Ho для решения этой проблемы?
По умолчанию скрытые файлы (т.е. те, которые запускаются с периода), исключены из расширения шарика оболочки удара. Однако можно изменить то использование dotglob
установка, например,
$ mkdir dir
$ touch dir/.hidden dir/visible
$ echo dir/*
dir/visible
$ shopt -s dotglob
$ echo dir/*
dir/.hidden dir/visible
можно сбросить опцию впоследствии с shopt -u dotglob
"Скрытые файлы" являются просто файлами, имя которых запускается с точки. В приложениях графический интерфейсов пользователя эти файлы обычно не показывают, откуда их имя.
можно использовать globbing оболочки:
cat {*,.*} | grep blabla
предыдущая команда включает все файлы без точки (*
) и все файлы, которые запускаются с точки (.*
).
Между прочим, это бесполезное использование кошки , и необходимо вместо этого записать команду как:
grep blabla {*,.*}
Использовать find
команда с логическим ИЛИ флагом (-o
) и -exec . . .\+
флаг
find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "MySearchTerm" {} \+
Объяснение:
find
рекурсивная команда, которая ищет файлы в указанном каталоге. В этом случае это .
текущий рабочий каталог.-maxdepth
флаг говорит нам оставаться только в текущем каталоге. Если Вы хотите пойти рекурсивно или указать, сколько подкаталогов к спуску, изменить 1
к количеству уровней Вы хотите пойти.\( . . .\)
часть предотвращает оболочку обработки что как подоболочка, довольно рассматривающая это как группировка аргументов find
.-iname
флаги позволяют указывать для который имена файлов искать.-o
флаг скажет, находят для поиска файлов *.*
или файлы, которые запускаются с продвижения точки, скрытых файлов.-exec . . .{}
структура позволяет выполнять определенную команду для работы на найденные файлы. \+
скажет find
для взятия всех файлов в качестве аргументов в пользу команды, Вы хотите работать в этом случае grep
.Вот небольшой пример, где Вы видите SEARCHFILE.txt
и .SEARCHFILE.txt
оба найдены:
DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "HelloWorld" {} \+ 2>/dev/null
./SEARCHFILE.txt:HelloWorld ! I'm found
./localDir.txt:HelloWorld.so
./localDir.txt:HelloWorld.c
Binary file ./2015-05-05-raspbian-wheezy.img matches
./.SEARCHFILE.txt:HelloWorld ! I'm found