Что делает "grep -v "^.$""

Попробуйте:

gphoto2 -f /store_00020002/DCIM/100PHOTO -d 1
1
26.09.2016, 13:21
5 ответов

grep -v "^.$" напечатает все строки из ввода, кроме тех, которые имеют только один символ.

Поскольку он используется в:

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

мы можем предположить, что он отбрасывает текущий рабочий каталог (. ) из выходных данных find (показано при относительном пути . используется), что может быть легко достигнуто с помощью опции -mindepth 1, хотя здесь она избыточна, так как вы используете абсолютный путь в find.

Позже вы будете искать только файлы с data- в их именах по grep data-, это тоже излишне. Вы можете поместить всю логику в один вызов find:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

Drop -print тоже, это действие по умолчанию:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

Просто чтобы отметить, если вы ищете только файлы, добавьте -тип f тоже:

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15
3
27.01.2020, 23:13

Команда grep -v "^.$" "удалит" из потока текущий каталог и любой файл/каталог, имя которых от одного символа. Например, пусть выполняется

ls -a
.  ..  a1 a2 a3

и пусть исполняется с помощью grep

ls -a |grep -v "^.$"
..
a1
a2
a3

Как видите, точка исчезает

0
27.01.2020, 23:13

grep -v '^. $' исключает строки, содержащие только один символ.

Пример:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar
0
27.01.2020, 23:13

Удаляет . Каталог из списка результатов поиска . Это проще объяснить на примере:

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

Как видите, в первом фрагменте кода мы находим . результат. Итак, вы передаете его действиям, выполняемым циклом для .
Во втором фрагменте вы решили пропустить . Каталог из результатов find , поэтому вы не отправляете его в для цикла .

1
27.01.2020, 23:13

Как уже говорили другие, grep -v '^. $' отфильтровывает строки, состоящие ровно из одного символа (строки, состоят из начала строки ( ^ ), за которым следует один символ (. ), за которым следует конец строки ( $ ). Другой способ записи это будет grep -vx. , где -x делает ^ и $ неявными (. совпадает со всей строкой).

На выходе:

find /ddomain/data/shop12/ -mtime +15 -print

Это не имеет особого смысла, потому что выходные данные этой команды find обычно состоят из таких строк, как:

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

Единственный способ для этого вывод, содержащий строки с одним символом, - это если есть файл с именем вроде foo X . Это вполне возможно, но я бы сказал, что вряд ли это было намерением этого команда.

Возможно, эта команда была (неправильно) адаптирована из:

find . -mtime +15 -print | grep -v '^.$' | grep data-

Где этот grep предназначался для фильтрации . Запись (даже тогда grep -Fvx. было бы более подходящим). Однако тогда было бы разумнее написать его:

find . ! -name . -path '*data-*' -mtime +15

Если вы хотите отфильтровать каталог верхнего уровня с помощью find / ddomain / data / shop12 / , вы должны сделать это как :

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

Или, если ваша реализация find поддерживает предикат -mindepth :

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15
3
27.01.2020, 23:13

Теги

Похожие вопросы