【问题标题】:Pass a bash variable to a perl command将 bash 变量传递给 perl 命令
【发布时间】:2017-06-15 17:26:15
【问题描述】:

我正在尝试使用以下结构重命名文件夹:

xxx_name_surname/
├── whatever.jpg
├── foobar.jpg
├ [...]
├── barfoo.jpg
└── full
    ├── whatever.jpg
    ├── foobar.jpg
    ├ [...]
    ├── barfoo.jpg

类似:

xxx_name_surname/
├── 001_name_surname.jpg
├── 001_name_surname.jpg
├ [...]
├── 011_name_surname.jpg
└── full
    ├── 001_name_surname.jpg
    ├── 002_name_surname.jpg
    ├ [...]
    ├── 011_name_surname.jpg

我正在使用以下脚本:

#!/bin/sh
for d in *; 
    do
        if [ -d "$d" ]; then
            cd $d;

            folder_name=${PWD##*/}
            image_name=${folder_name:4}
            echo Current dir is:
            echo $current_dir
            echo "Rename and sanitize image in folder ..."
            export $image_name

            rename -f -N ...001 -X -e '$_ = $N . '_' . $_' *.jpg

            echo
            echo "Creating folder" $d"/full ..."
            mkdir full
            echo "Adding padding to image ..."
            mogrify -path full -background white -gravity center -resize 1920x1080\> -extent 1920x1080 *.jpg
            cd ..
            echo
        fi
done

echo "Done."

我制作的脚本试图:

  • 解析文件夹结构
  • 获取父文件夹名称(不带xxx号)
  • 重命名和清理文件名(重命名是一个 Perl 脚本 -> 参考 http://plasmasturm.org/code/rename/
  • 使用 mogrify 创建完整版本的图像并将输出放在完整文件夹中。

我的问题与重命名命令有关:

rename -f -N ...001 -X -e '$_ = $N . '_' . $_' *.jpg

根据manual page 是否可以使用计数器作为前缀重命名文件。 我知道这是与将 bash 参数传递给 perl 脚本相关的语法问题。我在 stackexchange 上也找到了相同的答案,但由于我不是 perl 专家,我无法解决自己的问题。

然后我知道该脚本非常简单,但我想问一下您是否有建议以获得相同的结果 - 使用 bash,命令行 - 但以更好的方式。

谢谢。

【问题讨论】:

  • 这是 bash,而不是 Perl。您指的是哪种 Perl 脚本?此外,您的示例树输出显示文件名两次。
  • 我指的是重命名命令,它是用 Perl 写的 plasmasturm.org/code/rename
  • 我认为-N ...001 没什么特别的。这不是什么魔法,它只是一根绳子。在rename 程序中,它解析该字符串。我认为您不需要第二个零,只需执行-N ...01 就足以使数字与需要和零填充一样宽。您是否使用-n 运行您的程序以进行试运行,看看会发生什么?
  • 哦。好的。看起来-e 等同于perl -e,它以perl 代码的形式运行东西,比如eval。你混淆了引号。 -e '$_ = "$N" . "_" . $_' 应该这样做。或者-e '$_ = "${N}_$_"',如果你想让它不那么可读。
  • 我有一个解决方案:` IMAGENAME=$(echo $image_name) export IMAGENAME rename -f -N ...001 -X -e '$_ = $N 。 “_”。 $ENV{IMAGENAME}' *.jpg`

标签: bash image perl rename subdirectory


【解决方案1】:

解决方案

这解决了我的问题:

    IMAGENAME=$(echo $image_name)
    export IMAGENAME
    rename -f -N ...001 -X -e '$_ = $N . "_" . $ENV{IMAGENAME}' *.jpg

所以最终的 bash 脚本是:

#!/bin/sh

for d in *; 
    do
        if [ -d "$d" ]; then
            cd $d;
            folder_name=${PWD##*/}
            image_name=${folder_name:4}

            echo "Rename and sanitize image in folder ..."
            IMAGENAME=$(echo $image_name)
            export IMAGENAME
            rename -f -N ...001 -X -e '$_ = $N . "_" . $ENV{IMAGENAME}' *.jpg
            echo "Creating folder" $d"/full ..."
            mkdir full
            echo "Adding padding to image ..."
            mogrify -path full -background white -gravity center -resize 1920x1080\> -extent 1920x1080 *.jpg
            cd ..
            echo
        fi
done
echo "Done."

注意

如您所见,该脚本不是最好的解决方案,但它正在发挥作用。

【讨论】: