Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何避免在下面场景的shell脚本中重复?_Bash_Shell - Fatal编程技术网

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

Bash 如何避免在下面场景的shell脚本中重复?,bash,shell,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

如何避免在下面场景的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/

创造

输出:

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

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

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

顺便说一句,没必要绕圈子。使用你拥有的工具。 需要在目录树中查找所有*.jpg文件吗? -->
find-名称*.jpg

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

因此,我们有以下脚本:

要捕获要转换的剩余照片

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

要捕获已转换的

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

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

然后,您可以使用:


对于$格式的图像(find.-name*.jpg | uniq-u);做
回显“$图像剩余”
完成

我知道我没有真正回答这个问题,但在shell语言的背后还有一个哲学,那就是“不要重新发明轮子”。 保持简单和直接。我想让你感受一下。有很多工具。将它们与流水线技术相结合,您就拥有了真正的shell killer功能


注意:不要使用
${conimagename#*/}
首选
basename$conimagename
。在命名上要明确。conimagename不会跟我说话。

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

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

conimagename
的值是什么,
${conimagename#*/}
为所有三个文件生成相同的结果?当应该为外部循环保存时,您似乎在内部循环中输出。不相关,但您可以在$path中为conimagename说
直接;您不必为循环使用临时变量,只需将其分配给另一个变量即可。什么是“bellow scene”?由于文件名中有数字,因此应该很明显,
grep 1
不是解决方法,在这种情况下,1.jpg将报告为要转换的照片(基于示例)。您可能需要检查uniq手册,它有开关,可以只打印唯一行或重复行。您应该使用-printf find选项,而不是
-exec basename..
,并避免使用不必要的fork(在这种情况下,find并不合适)好的,我忘记了图片的名称可以包含数字这一事实。但是它可以用适当的regexp no解决吗?“^1”呢?我不是regexp方面的专家,但我相信这很容易解决。不管怎样,你对uniq的看法是对的。我更新答案。