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