0

我应该在 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

4 回答 4

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 {} \;)
于 2009-06-02T08:05:46.660 回答
1

(我不能添加评论,但是...)

为了可靠地处理带有空格的文件名,您可能需要考虑将文件列表存储在临时文本文件中而不是变量中,并使用 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
于 2009-06-02T12:28:53.243 回答
1

您的“查找”语法看起来不错。尝试删除命令字符串周围的引号,即

FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;)
于 2009-06-02T08:07:07.140 回答
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
于 2009-06-02T08:07:34.627 回答