我根据扩展名对文件进行排序的脚本失败

我根据扩展名对文件进行排序的脚本失败

我正在从损坏的磁盘中恢复文件,但它会将它们随机排序在名为 dir1、dir2、... 的文件夹中

我正在尝试创建一个脚本,根据其扩展名对文件夹进行排序

问题是有些文件没有扩展名,脚本正在为每个文件创建一个文件夹,而实际上应该忽略它们。

这是我的代码:

#!/bin/sh

BASEPATH=/media/potato/toshiba/WD320
SOURCEPATH=$BASEPATH/recovered/*
DESTINATIONPATH=$BASEPATH/sorted
DELIMITER="."

function iterateFolder {
    for filename in $1; do
            #checks if file is actually a folder
            #if it is a folder call this function again
            if [ -d $filename ] ;
            then
                    echo "iterating folder $filename"
                    iterateFolder "$filename/*"
            else            
                    #checks if the name of the file has extension ( actually it checks if there is "." in the name of the file)
                    #if it doesn't, ignore the file

                    if [ -z "${filename##*$DELIMITER*}" ] ;
                    then
                            fileExtension="${filename##*.}"
                            #checks if already exists a folder in the destination folder with the name of the extension
                            if [ ! -d "$DESTINATIONPATH/$fileExtension" ] ;
                            then
                                    newDir="$DESTINATIONPATH/$fileExtension"
                                    echo "creating folder $newDir"
                                    mkdir -p $newDir
                            fi
                    fi
            fi
    done
}
iterafteFolder "$SOURCEPATH"

答案1

你的错误就在一线if [ -z "${filename##*$DELIMITER*}" ] ;。运算##符必须进行完全匹配才能从字符串中删除任何内容;因此,如果文件名.中没有 a ,它将不会被 修改##,从而导致if条件成功。我们可以在 shell 中测试它:

$ foo=bar
$ if [ -z "${foo##*.*}" ]; then echo 'Yes'; fi
Yes
$

更传统的方法是使用[[=~限定符来检查正则表达式。例如:

$ if [[ $foo =~ *.* ]]; then echo 'Yes'; else echo 'No'; fi
No
$

您可以在这里了解更多信息[[其要点是,它[[更强大、更灵活,但代价是成为系统二进制文件而不是 shell 内置程序,从而因启动新进程而导致理论上的性能损失。处罚几乎可以忽略不计,因此您不必担心。

相关内容