bash:如何分隔字符串以查找文件

时间:2009-06-02 07:51:16

标签: bash find

我应该在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 个答案:

答案 0 :(得分: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 :(得分:1)

'find'的语法看起来不错。尝试删除命令字符串周围的引号,即

FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;)

答案 2 :(得分: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

答案 3 :(得分:1)

(我无法添加评论,但是......)

为了可靠地处理文件名 with spaces ,您可能需要考虑将文件列表存储在临时文本文件而不是变量中,并使用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