在 Shell 脚本中将目录工作目录更改为先前目录

在 Shell 脚本中将目录工作目录更改为先前目录

有什么办法可以实现以下目标吗?我只能执行我的任务。

我编写了 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 findsort、 和head作为-print0、 和-zNUL 分隔符选项。

如果您更喜欢 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

使用 GNUdatebash(或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)

相关内容