我已经研究了一段时间了,我想我准备放弃了。我尝试使用 imagemagick 处理子文件夹montage
以创建联系表。
这基本上是我所得到的最接近的结果:
find '/dir-with-spaces/' -type f -regex ".*\.\(JPG\|jpg\|jpeg\|JPEG\)" -print0 | \
while IFS= read -r -d $'\0' line;\
do \
montage "$line" "${line}".jpg; \
done
使用此命令,Montage 会单独处理每张图片。我想要的行为是 find 会搜索最低目录中的图片、备份、发送所有图片montage
,然后继续搜索下一个文件夹,并根据整个文件夹树的名称生成联系表。
IE:
/media/pictures/folder1/folder2/pic1.jpg...pic100.jpg --> media-pictures-folder1-folder2.jpg
我尝试想出的其他一些事情是:
#This just hangs montage forever
find . -name *.jpg -printf '%h\n' | sort -u | xargs -I {} montage {}/*
#I need a "+" here for -execdir, but I don't think I can use it with montage's argument structure.
find . -name *.jpg -execdir montage {} test.jpg \;
目录结构如下:
folder1
folder1_1
folder1_2
folder1_3
*.jpg
folder2
folder2_1
*.jpg
folder3
folder3_1
folder3_2
folder3_4
folder3_5
*.jpg
运行 Ubuntu 14.10
任何帮助都将不胜感激。
答案1
我遇到过类似的问题,但没有文件夹的文件名部分。下面是一个可以执行您要求的脚本。更改base
为您的起始文件夹。montage
使用选项-geometry
以 px 为单位设置图块大小“宽度”x“高度”,-tile
图块数量为“列”x“行”。
#!/bin/bash -eu
base="/usr/share/icons/hicolor"
find "$base" -type d | while read fld
do
[ $fld == $base ] && continue
echo ">>> $fld"
aux="${fld//\//_}"
aux="${aux:1}"
find "$fld" -type f -maxdepth 1 -iregex ".*\.\(jpg\|jpeg\|gif\|svg\|png\)" > "/tmp/${aux}.txt"
if [ -s "/tmp/${aux}.txt" ]
then
montage "@/tmp/${aux}.txt" -geometry 64x -tile 3x "${aux}.jpg"
fi
rm "/tmp/${aux}.txt"
done