2016-08-01 2 views
3

Я пытаюсь создать цикл for для удаления файлов журнала старше 15 дней. Ниже мой сценарий:Сценарий оболочки Linux для ошибки цикла

#!/bin/sh 
path="/home/test" 

logpath="$path/logs" 
for logfile in `find $logpath -mtime +14 -type f -name *.log` 
do 
    echo "Deleting Log File: " $logfile 
    rm -rf $logfile 
done 

Он продолжает бросать ошибку:

find: paths must precede expression 
Usage: find [-H] [-L] [-P] [path...] [expression] 

Любые идеи?

+0

Вы пробовали положить $ LogPath перед тем *. журнал ? –

+1

Попробуйте обернуть '* .log' в двойные кавычки, например' '* .log" ' – Fazlin

+0

Как выполнить сценарий? Он работает отлично для меня, выполняя его, как «./test.sh» –

ответ

4

Пожалуйста, попробуйте это - добавлено одиночные кавычки

#!/bin/sh 
path="/home/test" 

logpath="$path/logs" 
for logfile in `find $logpath -mtime +14 -type f -name '*.log'` 
do 
    echo "Deleting Log File: " $logfile 
    rm -rf $logfile 
done 
2

Вы можете использовать exec из параметров find, чтобы избавиться от цикла:

find $logpath -mtime +14 -type f -name '*.log' -exec rm -rf {} \; 

или как @Patryk Обара говорит:

find $logpath -mtime +14 -type f -name '*.log' -delete 

которые неявно разрешают -depth.

Вы можете проверить это следующим образом:

mkdir test 
cd test 
touch test1.log 
touch test2.log 
find . -type f -name '*.log' 
ls 
> test1.log test2.log 
find . -type f -name '*.log' -delete 
> empty 
+2

Или даже лучше, 'find' имеет ярлык для этого, вы можете использовать' -delete' вместо '-exec rm -rf {} \;'. –

+0

Это неверный и, очевидно, не был протестирован. У вас такая же проблема, как и у OP: вы должны избегать '*' в '-name' с одинарными кавычками. '-name '* .log'' ... – smassey

+0

@smassey Я добавил скрипт, который работает. Не могли бы вы объяснить, почему вы думаете, что одни кавычки помогут? – Till

Смежные вопросы