【问题标题】:Bash removes leading / in path [duplicate]Bash删除路径中的前导/ [重复]
【发布时间】:2020-11-22 03:10:15
【问题描述】:

我有一个简单的脚本来调整图像大小:

#!/usr/bin/bash

right_size='/home/scripts/images_correct_size'
user=$(whoami)

case $user in
    'sonarr')
        folder='/var/lib/sonarr/MediaCover'
        ;;
    'radarr')
        folder='/var/lib/radarr/MediaCover'
        ;;
    'jellyfin')
        folder='/var/lib/jellyfin/metadata'
        ;;
    *)
        echo "This user cannot run the script."
        ;;
esac

echo "Running script as $user."

find $folder -type f -name "*.jpg" | while IFS= read -r line
do
    echo "Current file: $line"
    # Grep has a match
    if grep -q $line $right_size; then
        :
    else
        size=$(ffprobe -hide_banner -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 $line)
        width=$(cut -d ',' -f 1 <<<$size)
        height=$(cut -d ',' -f 2 <<<$size)

        if [[ $width -gt 1024 ]] && [[ $width -ge $height ]]; then
            echo "File width too large, reducing."
            ffmpeg -hide_banner -y -i $line -vf scale=1024:-1 $line > /dev/null 2>&1
            echo $line >> $right_size
            continue
        elif [[ $height -gt 1024 ]] && [[ $height -ge $width ]]; then
            echo "File width too large, reducing."
            ffmpeg -hide_banner -y -i $line -vf scale=-1:1024 $line > /dev/null 2>&1
            echo $line >> $right_size
            continue
        else 
            echo "File is right, nothing to do."
            echo $line >> $right_size
        fi
    fi
done

当它运行并执行ffmpeg 时,对于下一行,变量line 没有初始/,从而使脚本在一次迭代中无用。在循环的下一次迭代中,一切都恢复正常。 这是输出的一部分,问题是可见的:

Current file: /var/lib/radarr/MediaCover/154/fanart-180.jpg
File is right, nothing to do.
Current file: /var/lib/radarr/MediaCover/154/fanart.jpg
File width too large, reducing.
Input #0, image2, from '/var/lib/radarr/MediaCover/154/fanart.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 78855 kb/s
    Stream #0:0: Video: mjpeg (Progressive), yuvj420p(pc, bt470bg/unknown/unknown), 3840x2160 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0x5603ac596680] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to '/var/lib/radarr/MediaCover/154/fanart.jpg':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 1024x576 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.91.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame=    1 fps=0.0 q=7.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.754x    
video:38kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Current file: var/lib/radarr/MediaCover/154/poster-500.jpg
var/lib/radarr/MediaCover/154/poster-500.jpg: No such file or directory
File is right, nothing to do.
Current file: /var/lib/radarr/MediaCover/3/poster.jpg

为什么会这样?

【问题讨论】:

  • 请先将您的脚本粘贴到shellcheck.net,然后尝试实施那里提出的建议。
  • 我猜while read 循环中的某些内容从标准输入中消耗了一个字节,可能是为了响应y/n 提示之类的内容。尝试在选定的行上从/dev/null 重定向标准输入(我的主要嫌疑人是ffprobe
  • 确实,ffmpeg 消耗了一个字节。按照这里的建议link 使用-nosdtin 运行它可以解决问题。

标签: bash loops variables ffmpeg


【解决方案1】:

ffmpeg 命令根据shellcheck.net 消耗一个字节。 使用-nostdin 选项运行它可以解决问题。

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多