繁体   English   中英

bash脚本,在for循环中处理文件名中的空格奇怪的行为

[英]bash scripting, handling spaces in filesnames in a for loop strange behaviour

救命。 我尝试过的一切都失败了。 我正在尝试修复我的视频收藏,其中很多要在名称/ etc中加空格,我想对其进行转码,并且我在下面编写了脚本,但失败了。 我用于测试的文件名中有2个是“ 13 Eerie(2013).avi”和“ Ace.Ventura.When.Nature.Calls.1995.720p.WEB-DL.x264-mSD.mkv”

我已经尝试了从使用print0到修改IFS的几件事。 任何援助将不胜感激。 当前版本由于某些原因将e字符的所有内容分隔开


convert.sh

#!/bin/sh

OUTDIR="./done/"
LOGDIR="./logs/"
BACKUPDIR="./backup/"

# deal with spaces
SAVEIFS=$IFS
IFS=$(echo -en "\n")

# pull all files except MP4 or scripts in the CURRENT DIR only
for FULLFILENAME in `find . -maxdepth 1 -type f -not -iname "*.sh" -not -iname "*.mp4" -print`
do
    # extract the file extension
    filename=$(basename "$FULLFILENAME")
    ext="${filename##*.}"
    filename="${filename%.*}"

    # use handbrake to convert to x264
    HandBrakeCLI -i "$FULLFILENAME" -o "$OUTDIR$filename.mp4" -e x264 -q 22 -r 29.97 -B 64 -O 2>$LOGDIR$filename.log

    # move the original file to a backup
    mv "$FULLFILENAME" $BACKUPDIR
done

#restore the field separator
IFS=$SAVEIFS
  • 不要使用命令替代find
  • 不要用于循环
  • 使用流程替换从find获取输出
  • 使用-print0选项并使用while循环读取
  • 最好避免使用大写的变量名
  • 使用bash shebang

码:

#!/bin/bash

outdir="./done/"
logdir="./logs/"
backupdir="./backup/"


# pull all files except MP4 or scripts in the CURRENT DIR only
while IFS= read -r -d '' fullfilename
do
    # extract the file extension
    filename="$(basename "$fullfilename")"
    ext="${filename##*.}"
    filename="${filename%.*}"

    # use handbrake to convert to x264
    HandBrakeCLI -i "$fullfilename" -o "$outdir$filename.mp4" -e x264 -q 22 -r 29.97 -B 64 -O 2>"$logdir$filename.log"

    # move the original file to a backup
    mv "$fullfilename" "$backupdir"
done < <(find . -maxdepth 1 -type f -not -iname "*.sh" -not -iname "*.mp4" -print0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM