我正在从损坏的磁盘中恢复文件,但它会将它们随机排序在名为 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 内置程序,从而因启动新进程而导致理论上的性能损失。处罚几乎可以忽略不计,因此您不必担心。