BASH dirname basename空格问题

时间:2015-04-08 04:11:05

标签: bash

编写脚本以优化网络图像。文件名和名称中包含空格的目录存在问题。

继承我所拥有的:

read -p "Enter full path from root (/) to your site... example /var/www/public_html: " path1
echo ""
#read -p "Enter in ImageMagick quality (default is 80) if unsure enter 80: " optjpg
#echo ""
#id="$(id -u optiimage)"
cmd="id -u optiimage"
eval $cmd
id=$(eval $cmd)
tmp1="${path1}/shell/optiimage/imagemagick"
tmp2="${path1}/shell/optiimage/imagemagick/jpg"
restore1="${path1}/shell/optiimage/restore"
restore2="${path1}/shell/optiimage/restore/imagemagick/jpg"
backup1="${path1}/shell/optiimage/backup"
backup2="${path1}/shell/optiimage/backup/imagemagick/jpg"
log1="${path1}/shell/optiimage/log/imagemagick/"
DATE="$(date +%a-%b-%y-%T)"
# Need user input for www path from root
##
## Make directories
##
############################################################################################################
mkdir -p ${tmp1}
mkdir -p ${tmp2}
mkdir -p ${restore1}
mkdir -p ${restore2}
mkdir -p ${backup1}
mkdir -p ${backup2}
mkdir -p ${log1}
mkdir -p ${path1}/build

    echo "Processing JPG Files"
    find $path1 -iname "*jpg" | \
    #write out script to put on cron for image optimization
while read file;
do
    # If not equal to optimage uid
    # to check username id -u optimage
    if [ -u "${id}" ]; then
        filebase=`basename "$file" .jpg`
        dirbase=`dirname "$file"`
        echo "${dirbase}/${filebase}.jpg already optimized" >> ${log1}_optimized_$DATE.log
    else
    #simple log for size of image before optimization
    ls -s $file >> ${log1}_before_$DATE.log
    #Do the following if *.jpg found
        filebase=`basename $file .jpg`
        dirbase=`dirname $file`
        echo "cp -p ${dirbase}/${filebase}.jpg ${tmp2}" >> ${path1}/build/backup_jpg.txt
        echo "chown optiimage:www-data ${filebase}.jpg" >> ${path1}/build/restore_jpg.txt #${restore1}/imagemagick.sh
        echo "cp -p ${filebase}.jpg ${dirbase}/${filebase}.jpg" >> ${path1}/build/restore_jpg.txt #${restore1}/imagemagick.sh
    ##
    ## ImageMagick
    ## Original Command:
    ## convert $file -quality 80 ${filebase}.new.jpg
    ##########################
        echo "convert ${dirbase}/${filebase}.jpg -quality 80 ${tmp2}/${filebase}.jpg" >> ${path1}/build/imagemagick.txt 
        echo "mogrify -strip ${tmp2}/${filebase}.jpg" >> ${path1}/build/imagemagick.txt
        echo "chown optiimage:www-data ${tmp2}/${filebase}.jpg" >> ${path1}/build/owner_jpg.txt
        echo "rm ${dirbase}/${filebase}.jpg" >> ${path1}/build/remove_jpg.txt
        echo "cp -p ${tmp2}/${filebase}.jpg ${dirbase}/" >> ${path1}/build/migrate_jpg.txt

优化后图像大小的简单日志

     ls -s $file >> ${log1}_after_$DATE.log
    fi
done

我已根据一些人给我的建议对此进行了编辑。它似乎没有用。 如果我删除名称中包含空格的目录,否则它会在空格处结束名称并获取错误目录不存在。

2 个答案:

答案 0 :(得分:7)

  1. 您需要双引号变量替换。这适用于命令替换内部以及顶级词汇上下文。唯一的例外是从另一个字符串变量中分配字符串变量,例如str2=$str1;,尽管其他类型的变量赋值通常需要引用,例如从数组切片中分配字符串变量,即使它只切片一个元素,例如str="${@:1:1}";
  2. 虽然这里不太可能出现问题,但如果你提供一个或多个readNAME内置条带会导致和尾随空格。您可以通过不提供任何NAME来解决这个问题,并且只是让它在默认情况下将整行存储在$REPLY变量中。
  3. 您应该始终使用-r内置的read选项,因为这可以防止在输入数据上执行反斜杠插值/删除的不明智的默认行为。
  4. 如果您不需要在字符串文字中进行任何插值,请将'...'语法更改为"...",因为前者不进行任何插值。
  5. 首选[[ ... ]]表达式评估表单为旧式[ ... ]表单,因为前一种语法稍微强大一些。
  6. 首选$(...)命令替换表单为旧式`...`表单,因为前一种语法具有更有利的嵌套属性(即,无需转义嵌套命令替换分隔符)。

  7. find "$path1" -iname '*jpeg'| \
        # write out script to put on cron for image optimization
        while read -r; do
            file=$REPLY;
            # If not equal to optimage uid
            # to check username id -u optimage
            if [[ -u "$id" ]]; then
                filebase=$(basename "$file" .jpeg);
                dirbase=$(dirname "$file");
                #MYBASENAME=$(basename "$1")
                echo "${dirbase}/${filebase}.jpeg already optimized" >>"${log1}_optimized_$DATE.log";
            fi;
        done;
    ;
    

答案 1 :(得分:6)

在所使用的每个地方引用您的$file变量:

find $path1 -iname "*jpeg" | \
    while read file;
    do
        if [ -u "${id}" ]; then
            filebase=`basename "$file" .jpeg`
            dirbase=`dirname "$file"`
        fi
    done