如何避免在下面的场景中重复shell脚本?

时间:2014-08-14 12:14:03

标签: bash shell

如何避免在shell脚本中重复以下场景?

我正在尝试使用文件夹结构执行shell脚本:

/tmp/demo/originals/*****contains 10 images****
/tmp/demo/originals/thumbnails/*****contains 3 images******

这两个文件夹的图像名称相同

下面是位于originals文件夹中的resize.sh文件的代码:

path="thumbnails/*.jpg";
for file in *.jpg;
do
  imagename=$file;
  for file in $path;
  do
   conimagename=$file;
   batchname=${conimagename#*/}
   if [[ $batchname == $imagename ]];
   then
   echo $batchname 'already converted'
   else
   echo $imagename 'remaining'
   fi
  done
done

在文件夹/tmp/demoresize/originals/

中创建了shell脚本

穿心莲

out put:

10.jpg remaining
10.jpg remaining
10.jpg remaining
1.jpg already converted
1.jpg remaining
1.jpg remaining
2.jpg remaining
2.jpg already converted
2.jpg remaining
3.jpg remaining
3.jpg remaining
3.jpg already converted
4.jpg remaining
4.jpg remaining
4.jpg remaining
5.jpg remaining
5.jpg remaining
5.jpg remaining
6.jpg remaining
6.jpg remaining
6.jpg remaining
7.jpg remaining
7.jpg remaining
7.jpg remaining
8.jpg remaining
8.jpg remaining
8.jpg remaining
9.jpg remaining
9.jpg remaining
9.jpg remaining

结果应为:

10.jpg remaining
1.jpg already converted
2.jpg already converted
3.jpg already converted
4.jpg remaining
5.jpg remaining
6.jpg remaining
7.jpg remaining
8.jpg remaining
9.jpg remaining

3 个答案:

答案 0 :(得分:0)

这是因为您为内循环的每次迭代打印了一些东西。您只需要打印一次结果,这意味着您需要在内部循环完成后打印它。因此,预设一个表示文件未找到的变量,然后在找到该文件时设置该变量。

result='remaining'
for file in $path;
do
 conimagename=$file;
 batchname=${conimagename#*/}
 if [[ $batchname == $imagename ]];
 then
 result='already converted'
 fi
done
echo $imagename $result

答案 1 :(得分:0)

您想要实现的目标可以通过

完成
for f in *.jpg; do 
   if [ -e thumbnails/$f ]; then 
      echo "$f already converted" ; else
      echo "$f remaining" ;
   fi;
done

答案 2 :(得分:-1)

顺便说一下,不需要循环。使用你拥有的工具。 需要在目录树中找到所有* .jpg文件?   - > find . -name *.jpg

重复的那些是已经转换的,另一个是剩余的。 我是对的吗?

所以我们有以下脚本:

要捕捉要转换的剩余照片

find . -name \*.jpg -exec basename {} \; | uniq -u

捕获已转换的

find . -name \*.jpg -exec basename {} \; | uniq -d

PS:给find的库是当前工作的目录,但可以是给脚本的参数。

然后您可以使用:

for image in $(find . -name *.jpg | uniq -u);do echo "$image remaining" done

我知道我并没有真正回答这个问题,但在shell语言背后还有一种“不要重新发明轮子”的哲学。 保持简单愚蠢。我希望你能感受到它。有很多工具。将它们与流水线混合,你就拥有了真正的贝壳杀手功能。

PS:请勿使用${conimagename#*/}首选basename $conimagename。明确你的命名。 conimagename不跟我说话。