用于递归创建包含内容的新文件的脚本

用于递归创建包含内容的新文件的脚本

我有一个文件夹树,其中每个文件夹包含两到三个 jpg 文件。由于我有很多文件夹,我想开发一个脚本,在每个包含 jpg 文件的文件夹中递归创建一个 Inkscape 文件,并使用包含文件夹的名称重命名 svg 文件。我怎样才能实现这个目标?

答案1

查找包含 JPG 文件的目录并inkscape对其运行:

find . -type d \
    -exec sh -c 'set -- "$1"/*.jpg; [ -e "$1" ]' sh {} ';' \
    -exec sh -c 'inkscape --export-plain-svg="$1/${1##*/}.svg" "$1"/*.jpg' sh {} ';'

这将查找当前目录下的目录。如果该目录至少包含一个.jpg文件,inkscape则在此目录上调用,从该目录中提取所有.jpg文件并将 SVG 文件导出到该目录中,并以该目录的名称作为文件名。

输出文件名的构造方式为$1/${1##*/}.svgwhere$1是脚本的第一个命令行参数sh -c(这是包含文件的目录的路径.jpg),而 where${1##*/}将从目录中删除路径并仅保留目录名称。

这是未经测试的,因为我没有inkscape并且我不熟悉该程序(除了阅读其手册)。

给定以下目录结构:

$ tree
.
|-- dirA
|   `-- 1
|       |-- file.jpg
|       |-- image.jpg
|       `-- picture.jpg
`-- dirB
    |-- 2
    |   |-- file.jpg
    |   |-- image.jpg
    |   `-- picture.jpg
    |-- 3
    |   |-- file.jpg
    |   `-- image.jpg
    `-- 4
        |-- file.jpg
        `-- image.jpg

6 directories, 10 files

这是会被执行的:

inkscape --export-plain-svg=./dirA/1/1.svg ./dirA/1/file.jpg ./dirA/1/image.jpg ./dirA/1/picture.jpg
inkscape --export-plain-svg=./dirB/2/2.svg ./dirB/2/file.jpg ./dirB/2/image.jpg ./dirB/2/picture.jpg
inkscape --export-plain-svg=./dirB/3/3.svg ./dirB/3/file.jpg ./dirB/3/image.jpg
inkscape --export-plain-svg=./dirB/4/4.svg ./dirB/4/file.jpg ./dirB/4/image.jpg

相关内容