有什么办法可以实现以下目标吗?我只能执行我的任务。
我编写了 shell 脚本,只有当脚本在同一个月执行时,它才会给出正确的输出
下面是我在脚本中使用的命令
cd $(find /home/application/Files/output/$(date +%Y)/$(date +%m) -type d|sort -r |head -1)
以下是系统中实际存在的目录格式
/home/application/Files/output/2018/01/30
现在的问题是:当我执行脚本时,它给出以下错误
find: `/home/application/Files/output/2018/02': No such file or directory
它正在寻找../2018/02
尚未创建的目录,因此我需要在/home/application/Files/output/2018/01/30
.
答案1
为什么要搜索可能尚不存在的 YYYY/MM/DD/ 目录?
只需搜索并cd
找到最近的 YYYY/MM/DD/ 目录:
cd "$(find /home/application/Files/output/ -type d \
-regex '.*/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]$' -print0 |
sort -rVz | head -z -n 1)"
注意:需要 GNU find
、sort
、 和head
作为-print0
、 和-z
NUL 分隔符选项。
如果您更喜欢 PCRE 风格的正则表达式,您可以这样做:
cd "$(find /home/application/Files/output/ -type d -print0 |
grep -z -P '/\d{4}/\d\d/\d\d$' | sort -rVz | head -z -n 1)"
或者,如果您必须使用当天的目录,无论它是否为空,请先创建该目录,然后再cd
进入该目录:
dir="/home/application/Files/output/$(date +%Y/%M/%d)"
mkdir -p "$dir"
cd "$dir"
mkdir
的-p
选项会创建该目录(如果该目录尚不存在)。它还创建任何所需的父目录。如果目录已经存在,它不会导致错误或抱怨。
答案2
使用 GNUdate
和bash
(或ksh93
),它会挑选出今天的目录,但如果未找到该日期的目录,则一次回溯一天,直到找到现有目录(或最多回退 30 天):
for (( i = 0; i < 30; ++i )); do
dir="/home/application/Files/output/$( date -d "now -$i days" +'%Y/%m/%d' )"
[ -d "$dir" ] && break
done
if [ ! -d "$dir" ]; then
echo 'Can not find recent output directory!' >&2
exit 1
fi
printf 'Using output directory "%s"\n' "$dir"
cd "$dir"
答案3
如果目录总是在同一天或非常接近同一日期创建,则它们的命名方式为:
cd $(find /home/application/Files/output/$(date +%Y)/ -mindepth 1 -maxdepth 1 \
-mtime -2 -type d |sort -r |head -1)
我没有测试过。也许最小/最大深度需要为 2。:)
此解决方案要求创建日期最多为 2 天。也许你也需要调整一下。
没有换行符:
cd $(find somepath/$(date +%Y)/ -mindepth 1 -maxdepth 1 -mtime -2 -type d |sort -r |head -1)