2009-06-02 4 views
0

Что синтаксис я должен использовать в Баш скрипт для получения списка файлов на основе 3 динамических значений: - старше, чем Х дней - в указанном каталоге - чье имя содержит указанную строку ?Баш: Как разграничить строки для поиска файлов

FILEAGE=7 
FILEDIR='"/home/ecom/tmp"' 
FILESTRING='"search-results-*"' 
FILES_FOR_REMOVAL=$("/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;") 
echo ${FILES_FOR_REMOVAL} 

Если я пытаюсь выше я получаю:

-bash: /usr/bin/find "/home/ecom/tmp" -maxdepth 1 -type f -mtime +7 -name "search-results-*" -exec ls -lth {} \;: No such file or directory 
+0

И помните, что когда вы положили выход найти в одной строке с помощью $(), вы не можете более точно определить отдельные имена файлов. Прочтите http://wooledge.org/mywiki/UsingFind – lhunath

ответ

2

Удалить лишние кавычки:

FILEAGE=7 
FILEDIR='/home/ecom/tmp' 
FILESTRING='search-results-*' 
FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;) 
1

Ваш синтаксис 'найти' выглядит нормально. Попробуйте удалить кавычки вокруг строки команды, т.е.

FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;) 
1
FILEAGE=7 
FILEDIR='/home/ecom/tmp' 
FILESTRING='search-results-*' 
/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec /bin/ls -lth '{}' \; 

Были некоторые дополнительные цитаты, которые создали ошибку. Также укажите полный путь к/bin/ls, чтобы избежать проблем с потенциальным псевдонимом ls (1). И чтобы получить имена файлов в отдельной строке, я сбросил переменную $ FILES_FOR_REMOVAL. Вы можете также использовать

/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -ls 
1

(я не могу комментировать, но ...)

Чтобы надежно обрабатывать имена файлов с пробелами , вы можете рассмотреть возможность сохранения списка файлов в Врем ИНД текстовый файл вместо переменной и цикл через него, используя некоторое время конструкцию (вместо для)

Например:

FILEAGE=7 
FILEDIR='/home/ecom/tmp' 
FILESTRING='search-results-*' 

TEMPFILE=".temp${RANDOM}" 
CMD="find \"${FILEDIR}\" -maxdepth 1 -type f -mtime +${FILEAGE} -name \"${FILESTRING}\" -exec /bin/ls -lth '{}' \;" 

$CMD > $TEMPFILE # write output to file 
while read thefile; do 
    do_somthing_to $thefile 
done < $TEMPFILE 

rm $TEMPFILE # clean up after 

Или, если вы только собираетесь использовать список один раз, труба на выходе непосредственно к конструкции в то время:

$CMD | while read thefile; do 
    do_something_to $thefile 
done