Утилита grep
ищет внутри файлов строки, соответствующие регулярным выражениям.
То, что вы (кажется )хотите сделать, это перечислить все файлы в текущем каталоге, которые содержат0
(ноль )в именах файлов и имеют суффикс имени файла .jpg
. Для этого вы должны использовать что-то вроде
ls -l./*0*.jpg
или просто
echo./*0*.jpg
Первая часть шаблона, *0*
, будет соответствовать любой строке, содержащей ноль, а последняя часть шаблона, .jpg
, будет ограничивать результирующие имена файлов теми, которые заканчиваются этим суффиксом. ./
означает «в этом каталоге» и действительно необходим только в том случае, если у вас есть имена файлов, начинающиеся с-
(тире )(. В противном случае они могут быть неверно истолкованы как параметры командной строки )¹.
Расширение этого шаблона выполняется оболочкой перед вызовом ls
, поэтому ls
получит расширенный список имен файлов, соответствующих шаблону, и перечислит их.
Обратите внимание, что шаблоны подстановки имен файлов не являются регулярными выражениями (, а только похожи на них ). grep
, с другой стороны, берет одно или несколько регулярных выражений и ищет их в содержимом файлов.
Ответ на вопрос, найденный в комментариях:"Предупреждение" – это форма -нефатального диагностического вывода. Другой тип — это «ошибка», которая обычно является фатальной (, т. е. программа не может продолжать работу в обычном режиме и завершается после вывода сообщения об ошибке ).
Диагностические сообщения обычно не считаются частью стандартного вывода, который команда производит во время нормальной работы, и обычно создаются в специальном «выходном потоке» (в так называемом «стандартном потоке ошибок», а не в « стандартный поток вывода" ), чтобы его можно было проверить отдельно или отбросить, и чтобы он не мешал обычному выводу команды.
Однако в этом случае grep
не может фактически показать данные, совпадающие с шаблоном, поскольку файл является двоичным и данные, скорее всего, непечатаемые, поэтому вместо этого он уведомляет вас о наличии match в файле с помощью сообщения Binary file IMG_2125.jpg matches
вместо (это на самом деле не диагностическое предупреждающее сообщение, как предполагает mikeserv).
¹ Обратите внимание, что если некоторые имена файлов содержат символы обратной косой черты, некоторые реализации echo
будут интерпретировать \n
, \b
... как escape-последовательности для расширения.
Одной из возможностей было бы использование tar-конвейера:
(cd ~user1/ && tar -c -p -f - bin/log) | (cd ~user2/ && tar -x -p -f -)
Это использует подоболочку для перехода к родительскому каталогу исходного местоположения, а затем указывает tar
записать архив каталога «log» в стандартный вывод. Вторая подоболочка переходит в родительский каталог места назначения, а затем указывает tar
извлечь архив, поступающий через стандартный ввод канала. Команды tar
объединены в цепочку с &&
для выполнения только в случае успешного выполнения соответствующей команды cd
.
Вы можете проверить это, сказав второму tar
просто распечатать входящее содержимое; просто измените -x
на -t
. Использование -p
с -t
не имеет значения и не повредит:
(cd ~user1/ && tar -c -p -f - bin/log) | (cd ~user2/ && tar -t -p -f -)