比较同一目录中具有相同名称的不同扩展名的文件

时间:2016-08-10 03:05:16

标签: bash

我有一个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

1 个答案:

答案 0 :(得分:1)

循环浏览当前目录中的所有ppt文件并测试它们是否比相应的pdf更新,然后do_something如果它们是:

for f in *.ppt
do
    [ "$f" -nt "${f%ppt}pdf" ] && do_something
done

-nt是一个比另一个文件更新的文件的bash测试。

注意:

  1. 不要解析lsls的输出通常包含文件名的“可显示”形式,而不是实际文件名。

  2. 构造for f in *.ppt可以可靠地处理所有文件名,甚至包含标签或名称中的换行符的文件名。

  3. 避免对shell变量使用全部大写。系统对其变量使用全部大写,您不希望意外覆盖变量。因此,请使用小写或混合大小写。

  4. shell具有内置删除后缀的功能。因此,例如,newfile=$(echo $file |cut -d"." -f1)可以用更有效和更可靠的格式newfile="${file%%.*}"替换。在奇怪的情况下,这一点尤其重要,即文件的名称以换行符结尾:命令替换会删除所有尾随换行符,但bash变量扩展名不会。

    此外,请注意cut -d"." -f1删除第一个句点后的所有内容。如果文件名有多个句点,则可能不是您想要的。表单${file%.*}只有一个%,会删除名称中 last 期后的所有内容。当您尝试删除标准扩展名(如ppt。

  5. )时,这更有可能是您想要的

    全部放在一起

    #!/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