使用 awk 的 bash 脚本使用时间戳重命名文件

使用 awk 的 bash 脚本使用时间戳重命名文件

我开始编写一个脚本来根据时间戳重命名文件。我以为我已经在命令行上解决了它,但不能作为脚本工作。脚本挂在 awk 行中。

这是到目前为止的小脚本。

#!/bin/bash
#renamePhotos.sh
#  a script to rename photos in current directory based on date
#  to be expanded

#  OUTPUT in $(ls -tr *.JPG); 
LIST="$(ls --full-time -tr *.JPG)"
echo "Starting..."

for i in "$LIST"; do
    echo  $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')
    echo
done

答案1

在这一行中:

echo  $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')

命令替换中的第一个 awk 没有指定任何输入,因此它从连接到终端的 stdin 读取,这意味着它等待您为其提供一些输入。

要从 shell 变量中为其提供一些输入,您可能需要通过管道将其输入:

echo "$var" | awk...

这样做echo $(foo bar)看起来很奇怪,因为 echo 只会打印命令的输出,如果您只是单独foo bar运行,那么在任何情况下都会发生这种情况。 foo bar(除了分词之外,但这很可能不是您想要的。)

还有for循环。

for i in "$LIST"; do

只会运行一次,并i设置为 的值LIST。由于$LIST被引用,它不会经过分词,并且for只看到列表中的一项。不过,如果您在不带引号的情况下执行此操作(如 中所示)for i in $LIST; do...,您会发现它也会在空格上分开。您需要设置IFS换行符来阻止这种情况。

即使在那之后,可能存在的问题是 的输出ls可能有点棘手:时间格式可能会根据区域设置而改变(尽管我不确定 是否会发生这种情况--full-time),并且它可能会破坏文件名中的不可打印字符。如果您知道您的区域设置并且文件名“不错”,那么它可能会起作用。

另一种方法是让 shell 找到文件,并使用类似的东西date --reference $file(如果有的话)来获取日期:

for f in *.jpg ; do 
    d=$(date +"%Y-%m-%d" -r "$f")  
    echo "$d $f" 
done

(GNU coreutilsdate--reference标志。date -r在 OS X 上需要时间而不是文件。)

相关内容