【问题标题】:Need recursive BASH script to traverse folders and use wildcards需要递归 BASH 脚本来遍历文件夹并使用通配符
【发布时间】:2023-03-14 11:45:01
【问题描述】:

我们一直在捕获文件并将其发送到 REST 服务器,并从工具栏将它们保存为 PNG 扩展名,现在有近 50 万个文件。

最近我们发现它们实际上是保存为 base64 流文件而不是 PNG 格式。

我有一个 python 脚本可以转换它们,但不是递归的,不使用通配符。

ImageMagick 说 base64 文件太大(最大 5K),因此无法转换。

 IE;  /bin/base64-to-png.py <base64_file_name>.png <output_name.png>

目录路径 /mnt/s3/pages/ 其中“pages”有几千个编号的文件夹。

 IE; /mnt/s3/pages/100 

   "pages" subfolders are never more than 1 folder deep.
   The files are typically 5540_thumb.png, 5540_snapshot.png and 5540_crop.png 
   where the 5540 is the capture number.

我需要一个 BASH 脚本包装器以使其在文件夹中重复,将所有原件复制到备份文件 (filename.b64) 并将通配符作为正确的路径/名称传递给 python 脚本,转换文件并将输出文件保留在相同的相应文件夹,然后使用 mogrify 压缩它们。

 IE;  base64-to-png.sh *_snapshot.b64 *_snapshot.png <compression number>

  should

    cp <file_name.png> <file_name>.b64
    /bin/base64-to-png.py <file_name.png> <file_name.png>
    mogrify -quality <compression number> -format png <file_name.png>

【问题讨论】:

    标签: bash recursion command-line options


    【解决方案1】:

    试试这个脚本

    #!/bin/bash
    SEARCHPATH=$1
    COMNUM=$2
    FINDEXT="*.png"
    
    for f in `find $SEARCHPATH -type f -name $FINDEXT` ; do
         #just get files name without extension
         fname=`echo $f | cut -d'.' -f1` 
         #perform operations
         cp $f ${fname}.b64
         /bin/base64-to-png.py $f $f
         mogrify -quality $COMNUM -format png $f
    
    done
    

    你可以这样称呼它

    $ base64-to-png.sh /somepath/tofind 100
    
    param 1 : path where to find `.png` files 
    param 2 : compression number.
    

    这假设/bin/base64-to-png.py 可以在绝对路径上工作,例如/somepath/somedir/somefile.png不仅仅是somefile.png

    警告:未进行任何质量检查,请自行承担风险!

    【讨论】:

    • 我相信在 for 行中 $FINDEXT 应该是双引号,对吧?
    • Rohan 你的脚本运行良好,我只需要将 FINDEXT="*.png" 更改为命令行变量,因为拇指文件需要压缩到不同的比例——非常感谢,这有帮助太棒了。
    • @user1213320 很高兴听到这个消息!
    【解决方案2】:

    将文件名从 png 更改为 base64:

    shopt -s globstar shopt -s nullglob 对于 *.png **/*.png 中的文件;做 if (file "${file}" | fgrep "ASCII" >/dev/null 2>&1);然后 # 文件名为 '.png' 但为 ASCII,移动它。 b64name="${file%.*}.b64" mv -f "${file}" "${b64name}" # 将 $b64name 转换为 $file 的插入命令 # 我认为这会起作用 base64 -d "${b64file}" > "${file}" || echo "${b64file} 转换失败" mogrify -quality -format png "${file}" 菲 完毕

    由于globstar 之类的原因,我相信这将需要 bash 4.0+。你可以通过bash --version找到你的版本

    如果您使用 python 进行 base64 转换至关重要,请随意更换命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多