2016-10-02 40 views
4

当我尝试仅根据存储在有关它们的.txt文件中的信息尝试打开图像时,我遇到了Bash中的问题。我试图按照大小或高度对许多图像进行排序,并按排序顺序显示图像,但如果文件夹中没有带相同名称的.txt文件的.jpg文件,则不应对其进行处理。bash - 仅当存在相应的文本文件时才打开图像

我有我的情况完成的排序片,并试图找出我将如何去打开只有.jpg文件扩展名为.txt文件的图像。

我想出一个解决方案看起来像我在一个目录,将每一个.JPG的名称(不包括扩展名),然后在列表中处理和运行是这样的:

[-f如果$ FILENAME.TXT]。然后~~~

但我遇到了没有for循环迭代的问题,否则所有的图片将打开多次。我的尝试是:

for i in *jpg; do 
y=$y ${i.jpg} 
done 
if[ -f $y.txt ] then 
(sorting parts) 

这只能看着y中的最后一个文件名,因为它应该,但我想,如果存在找出一种方式来看待每一个单独的文件名,并看到文本文件,为了将其包括在分类中。

非常感谢您的帮助!

+0

您是否尝试过在if语句中使用'&&'操作符? –

+0

@ user556068是的,查看名称和.txt是否都以文件形式存在,但我不知道如何处理列表中的每一个而不是最后一个。感谢您的答复! – Jillian

+0

你能否澄清一下这个问题,目前还不清楚你想要什么,可能是一个好主意,增加你提到的排序。您已经展示了一种检查文件存在的方法,它是标题中问题的解决方案。 –

回答

0

我会先做文件检查,以便只找到具有相应文本文件的报告文件。下面的代码片段将只显示jpg中具有相应txt文件中的文件:

find . -name "*.jpg" -maxdepth 1 -exec /bin/bash -c '[ -e "${0%.*}.txt" ] && echo "$0";' {} \; 
+2

这看起来像一个巨大的[无用的'echo'](http://www.iki.fi/era/unix/award.html#echo)。如果你摆脱了外部'echo'和命令替换,你也可以摆脱'grep',这将不再是必要或有用的。 – tripleee

+0

@tripleee:是的,你是对的 - 我改变了上面的代码片段。 – Julian

+0

'find'也会遍历子目录,这在需求中没有提到。也许添加'-maxdepth 1'来禁用它,也许删除多余的通配符。 – tripleee

1

在单个变量采集的文件名列表是一个反模式。你想要将它们收集在一个数组中。

a=() 
for f in *.jpg; do 
    if [ -e "${f%.jpg}".txt ]; then 
     continue 
    fi 
    a+=("$f") 
done 
# now do things with "${a[@]}" 

通常情况下,你并不真的需要收集在一个数组中的文件 - 只要你在做for循环内,以每个单独的文件的一切,你遍历文件。

(实际上y=$y ${i%.jpg}不追加到y - 它设置y它自身试图执行一个名为i SAN的.jpg扩展文件,这在绝大多数情况下,最有可能失败的持续时间。)

相关问题