我有一个bash脚本,它通过一个目录查看并从.pdf创建一个.ppt,但我希望能够查看.ppt是否已经有.pdf了,因为如果有的话我不会我想创建一个,如果.pdf的时间戳已经过了时间戳,那么.ppt我想更新它。我知道时间戳我可以使用(日期-r栏+%s)但我似乎无法弄清楚如何比较具有相同名称的文件,如果它们在同一个文件夹中。
这就是我所拥有的:
#!/bin/env bash
#checks to see if argument is clean if so it deletes the .pdf and archive files
if [ "$1" = "clean" ]; then
rm -f *pdf
else
#reads the files that are PPT in the directory and copies them and changes the extension to .pdf
ls *.ppt|while read FILE
do
NEWFILE=$(echo $FILE|cut -d"." -f1)
echo $FILE": " $FILE " "$NEWFILE: " " $NEWFILE.pdf
cp $FILE $NEWFILE.pdf
done
fi
编辑:
#!/bin/env bash
#checks to see if argument is clean if so it deletes the .pdf and archive files
if [ "$1" = "clean" ]; then
rm -f *pdf lectures.tar.gz
else
#reads the files that are in the directory and copies them and changes the extension to .pdf
for f in *.ppt
do
[ "$f" -nt "${f%ppt}pdf" ] &&
nf="${f%.*}"
echo $f": " $f " "$nf: " " $nf.pdf
cp $f $nf.pdf
done
答案 0 :(得分:1)
循环浏览当前目录中的所有ppt文件并测试它们是否比相应的pdf更新,然后do_something
如果它们是:
for f in *.ppt
do
[ "$f" -nt "${f%ppt}pdf" ] && do_something
done
-nt
是一个比另一个文件更新的文件的bash测试。
注意:
不要解析ls
。 ls
的输出通常包含文件名的“可显示”形式,而不是实际文件名。
构造for f in *.ppt
可以可靠地处理所有文件名,甚至包含标签或名称中的换行符的文件名。
避免对shell变量使用全部大写。系统对其变量使用全部大写,您不希望意外覆盖变量。因此,请使用小写或混合大小写。
shell具有内置删除后缀的功能。因此,例如,newfile=$(echo $file |cut -d"." -f1)
可以用更有效和更可靠的格式newfile="${file%%.*}"
替换。在奇怪的情况下,这一点尤其重要,即文件的名称以换行符结尾:命令替换会删除所有尾随换行符,但bash变量扩展名不会。
此外,请注意cut -d"." -f1
删除第一个句点后的所有内容。如果文件名有多个句点,则可能不是您想要的。表单${file%.*}
只有一个%
,会删除名称中 last 期后的所有内容。当您尝试删除标准扩展名(如ppt。
#!/bin/env bash
#checks to see if argument is clean if so it deletes the .pdf and archive files
if [ "$1" = "clean" ]; then
rm -f ./*pdf lectures.tar.gz
else
#reads the files that are in the directory and copies them and changes the extension to .pdf
for f in ./*.ppt
do
if [ "$f" -nt "${f%ppt}pdf" ]; then
nf="${f%.*}"
echo "$f: $f $nf: $nf.pdf"
cp "$f" "$nf.pdf"
fi
done
fi