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

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

У меня есть скрипт для очистки файлов данных

Команда:

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

Я попробовал запустить команду без grep -vфункции и не увидел никакой разницы.

Я хотел бы узнать, что grep -v "^.$"делает. Я не создавал этот скрипт и не могу найти ничего в сети.

решение1

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

Обратите внимание: если вы ищете только файлы, добавьте -type fтакже:

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

решение2

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

На выходе:

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

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

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

Единственный способ, чтобы этот вывод содержал строки с одним символом, — это если есть файл с именем вроде foo<newline>X<newline>. Это вполне возможно, но я бы сказал, что вряд ли это было целью этой команды.

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

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

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

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

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

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

решение4

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

Пример:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar

Связанный контент