У меня есть скрипт для очистки файлов данных
Команда:
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