我开始编写一个脚本来根据时间戳重命名文件。我以为我已经在命令行上解决了它,但不能作为脚本工作。脚本挂在 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 上需要时间而不是文件。)