gpt4 book ai didi

BASH dirname basename 空格问题

转载 作者:行者123 更新时间:2023-11-29 09:33:45 25 4
gpt4 key购买 nike

编写脚本来优化我的网络图片。名称中包含空格的文件名和目录有问题。

这是我所拥有的:

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

我根据一些人给我的建议编辑了这篇文章。它似乎没有用。如果我删除名称中带有空格的目录,这将正常工作,否则它会在空格处结束名称并获取错误目录不存在。

最佳答案

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

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;
;

关于BASH dirname basename 空格问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29505788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com