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
Команда grep -v "^.$" "удалит" из потока текущий каталог и любой файл/каталог, имя которых от одного символа. Например, пусть выполняется
ls -a
. .. a1 a2 a3
и пусть исполняется с помощью grep
ls -a |grep -v "^.$"
..
a1
a2
a3
Как видите, точка исчезает
grep -v '^. $'
исключает строки, содержащие только один символ.
Пример:
echo "foo
> bar
> x" | grep -v '^.$'
foo
bar
Удаляет . Каталог
из списка результатов поиска
. Это проще объяснить на примере:
find . -print
.
./prova2
./prova2/prova2
find . -print | grep -v '^.$'
./prova2
./prova2/prova2
Как видите, в первом фрагменте кода мы находим .
результат. Итак, вы передаете его действиям, выполняемым циклом для
.
Во втором фрагменте вы решили пропустить . Каталог
из результатов find
, поэтому вы не отправляете его в для цикла
.
Как уже говорили другие, grep -v '^. $'
отфильтровывает строки, состоящие ровно из одного символа (строки, состоят из начала строки ( ^
), за которым следует один символ (.
), за которым следует конец строки ( $
). Другой способ записи это будет grep -vx.
, где -x
делает ^
и $
неявными (.
совпадает со всей строкой).
На выходе:
find /ddomain/data/shop12/ -mtime +15 -print
Это не имеет особого смысла, потому что выходные данные этой команды find
обычно состоят из таких строк, как:
/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...
Единственный способ для этого вывод, содержащий строки с одним символом, - это если есть файл с именем вроде foo
. Это вполне возможно, но я бы сказал, что вряд ли это было намерением этого команда.
Возможно, эта команда была (неправильно) адаптирована из:
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