सबसे पहले, छवि नामों की सूची एकत्र करें:
ls *jpg | gawk -F_ '{print $2}' | sort | uniq
अब, उन्हें पास करें montage
:
ls *jpg | gawk -F_ '{print $2}' | sort | uniq |
while read n; do montage *\_$n\_* IMAGE_$n.jpg; done
यह मानता है कि आपके फ़ाइल नामों में कोई रिक्त स्थान या अन्य अजीब अक्षर नहीं हैं। मुझे आपके "आदर्श" मामले पर यकीन नहीं है। यदि आप अपने "आदर्श" आउटपुट को दिखाने के लिए सवाल अपडेट करते हैं, तो मुझे आपके लिए कुछ काम करने में सक्षम होना चाहिए।
अद्यतन करें:
यह मैंने लिखा एक छोटी सी पर्ल स्क्रिप्ट को वह करना चाहिए जो आपको चाहिए:
#!/usr/bin/env perl
my %k; ## declare the hash that will store the image names
while(<>){ ## loop through STDIN
chomp; ## remove newline (\n)
@a=split(/_/); ## split the line on '_' and save as array @a
###################################################
# Since the image names can have varying numbers #
# of "_", we want to use the penultimate item in #
# the array ($a[$#a-1]) as the image name prefix #
###################################################
$a[$#a-1]=~s/\d*//g;
#############################################################
# Now that we have the prefix ('A' or 'B' in your example), #
# we will save this image name in the hash of that prefix #
#############################################################
$k{$a[$#a-1]}{$_}=1;
}
## The keys of the hash '%k' are all the prefixes we have found
foreach my $prefix (keys(%k)){
@images=keys(%{$k{$prefix}}); ## all the images with this prefix
## Print the montage command to be executed (testing)
print "montage @images -title $prefix -tile 4x $prefix.jpg\n";
##############################################################
# If the commands printed above are correct, uncomment this #
# line to execute them instead of only printing. #
##############################################################
#`montage @images -title $prefix -tile 4x $prefix.jpg`
}
आप इसे या तो foo.pl
जो चाहें उसे सहेज सकते हैं और इसे इस तरह से चला सकते हैं:
ls *jpg | perl foo.pl
या आप इसे एक लाइनर के रूप में चला सकते हैं:
ls *jpg | perl -e 'my %k; while(<>){chomp; @a=split(/_/); $a[$#a-1]=~s/\d*//g; $k{$a[$#a-1]}{$_}=1;} foreach my $prefix (keys(%k)){@images=keys(%{$k{$prefix}}); `montage @images -title $prefix -tile 4x $prefix.jpg`;}'
महत्वपूर्ण : यह स्क्रिप्ट बहुत सरल है और यदि आपके फ़ाइल नामों में स्थान या अन्य अजीब अक्षर हैं तो यह काम नहीं करेगा। मैं यह मान रहा हूं कि यह आपके लिए कोई समस्या नहीं है, इसे ठीक करना अपेक्षाकृत आसान है, लेकिन सिंटैक्स को चारों ओर से अधिक जटिल बना देता है।
[name]-[letter][number]-[channel].jpg
, जहां[number]
सभी छवियों पर मौजूद नहीं है (पत्र केवल छवि का अवलोकन किया जा रहा है)। आदर्श रूप में एक ही सभी चित्र[name]
और[letter]
, प्रत्येक छवि के साथ लेबल एक ही असेंबल में होना चाहिए[channel]
, असेंबल एक हैडर जा रहा है होने[name]
और फ़ाइल का नाम[name]-[letter].jpg