Bash: Как разделить строки для поиска файлов - PullRequest
0 голосов
/ 02 июня 2009

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

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

Ответы [ 4 ]

2 голосов
/ 02 июня 2009

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

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 голос
/ 02 июня 2009

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

Чтобы надежно обрабатывать имена файлов с пробелами , вы можете рассмотреть возможность сохранения списка файлов во временном текстовом файле вместо переменной и перебрать его с помощью конструкции while (вместо for)

Например:

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

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

$CMD | while read thefile; do
    do_something_to $thefile
done
1 голос
/ 02 июня 2009
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 голос
/ 02 июня 2009

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

FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...