在bash命令

时间:2016-03-25 13:14:09

标签: linux bash shell awk

我有以下bash脚本:

#!/bin/bash

find . -maxdepth 1 -mmin +1 -type f -name "240*.ts" 
| xargs -L 1 bash -c 'mv "${1}" "$(get_crtime${1} | awk '{print $5}').ts"' \;

我们的想法是找到与某个模式匹配的超过一分钟的文件(在我的例子中,以'240'开头的文件)并将它们从原始名称(240-1458910816045.ts)重命名为所需的格式(15:00:16.ts)

在脚本中我使用的是get_crtime命令,它是/etc/bash.bashrc中包含的自定义函数,具有以下实现:

get_crtime() {

    for target in "${@}"; do
        inode=$(stat -c '%i' "${target}")
        fs=$(df "${@}" | awk '{a=$1}END{print a}')
        crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null |
        grep -oP 'crtime.*--\s*\K.*')
        printf "%s\t%s\n" "${target}" "${crtime}"
    done
}

当我从shell调用函数时,如下所示:

get_crtime 240-1458910816045.ts | awk '{print $5}'

我得到了所需的输出:

15:00:16

这是文件创建日期的一部分。

我的问题是当我在初始脚本中包含函数调用时,我收到以下错误:

}).ts": -c: line 0: unexpected EOF while looking for matching `)'
}).ts": -c: line 1: syntax error: unexpected end of file

我认为这是由于错误地调用awk引起的,所以我想删除它并离开:

find . -maxdepth 1 -mmin +1 -type f -name "240*.ts" 
| xargs -L 1 bash -c 'mv "${1}" "$(get_crtime ${1}).ts"' \;

我收到以下错误,这更具暗示性:

;: get_crtime: command not found

如何在初始命令中调用bashrc中的自定义函数而不会收到上一个错误?

谢谢!

  • 操作系统是Ubuntu
  • shell是bash

3 个答案:

答案 0 :(得分:1)

您不能在单引号分隔的脚本中使用单引号。看:

CustomerService

我不建议您在awk脚本周围使用双引号 - 创建一个脚本来为您执行mv等,或者找出其他方法来实现它,这也将解决您的函数访问问题。 / p>

答案 1 :(得分:0)

您需要导出该功能:

export -f get_crtime

这将使它可用于子bash进程(但不能用于其他shell)。

另外,正如@EdMorton指出的那样,你不能在单引号字符串中使用单引号,这是awk调用的问题。因此,您需要提出一种不同的方式来引用awk的内部参数,或修复get_crtime以返回您想要的字符串。

顺便说一下,您可以考虑使用find s -exec操作代替xargs。这将允许您在许多文件上使用循环,这会更有效。

例如

find . -maxdepth 1 -mmin +1 -type f -name "240*.ts" \
     -exec bash -c 'for f in "$@"; do
                      mv "$f" "$(get_crtime "$f" | awk {print\$5}).ts"
                    done' _ {} +

答案 2 :(得分:0)

在此示例中,使用了文件的修改时间,可以通过stat -c '%y'获取。 xargs -I参数创建了两次放置文件名的可能性,首先是stat,第二次是mv。然后使用参数扩展 bash功能从人类可读stat输出中仅提取时间

find . -maxdepth 1 -mmin +1 -type f -name "240*.ts" | \
xargs -I_ bash -c 'MTIME=$(stat -c '%y' "_") && MTIME=${MTIME#* } && mv "_" ${MTIME%.*}.ts'