所以我有一个包含数千个图像文件的文件夹,所有这些文件都保存为.jpg
。
问题是其中一些文件实际上是PNG图像文件,因此它们不会在很多程序中打开,除非我手动将其扩展名更改为.png
。例如,Ubuntu图像查看器会抛出此错误:
"解释JPEG图像文件时出错(不是JPEG文件:以0x89开头 为0x50)"
我已经运行了其中某些文件的 hexdump 来确认此错误并检出。
我正在寻找一种简单的方法来查找其他文件中扩展名错误的所有文件并更改其扩展名。例如,如何使用bash脚本执行此操作?到目前为止我还不知道。所有帮助都有所帮助!
答案 0 :(得分:8)
for f in *.jpg ; do
if [[ $(file -b --mime-type "$f") = image/png ]] ; then
mv "$f" "${f/%.jpg/.png}"
fi
done
这会获得.jpg
个文件的列表,然后为每个文件调用file
实用程序来获取mime类型。如果是image/png
,则使用string manipulation替换重命名文件。
答案 1 :(得分:1)
您想使用file
并解析输出。您可以通过检查输出的初始部分来检查它是JPEG还是PNG:
F="filename.jpg"
TYPE=$(file -b $F)
[[ $TYPE == JPEG\ image\ data* ]] && echo "jpg"
[[ $TYPE == PNG\ image\ data* ]] && echo "png"
您可以使用.jpg
删除basename
来更改扩展名。例如,以下内容会将文件$F
的扩展名.jpg
更改为.png
:
mv $F $(dirname $F)/$(basename $F .jpg).png
答案 2 :(得分:1)
首先获取文件列表并将其放入文件中。 然后将列表处理为循环,以便您可以自动逐个更改文件。
class Business(models.Model):
name = models.CharField(max_length=64)
address = models.CharField(max_length=64)
district = models.CharField(max_length=32)
city = models.CharField(max_length=32)
phone = models.CharField(max_length=32)
category = models.ManyToManyField(Category)
picture = models.ImageField(upload_to='business_image', blank=True, null=True)
slug = models.SlugField(unique=True)
pub_date = models.DateField(blank=True, auto_now_add=True)
position = GeopositionField()
MY_CHOICES = (('$', '$'),
('$$', '$$'),
('$$$', '$$$'),
('$$$$', '$$$$'),)
price = models.CharField(max_length=4, choices=MY_CHOICES)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Business, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
答案 3 :(得分:1)
使用file (1)
确定所有文件的类型。使用grep (1)
过滤此列表,删除所有正确的JPEG文件。剩下的是无法识别为JPEG的文件列表。
单行
file *.jpg | grep -v "JPEG image data"
- 确保验证JPEG image data
确实是file
在正确识别的JPG文件上返回的内容。
您可以使用sed (1)
删除冒号后面的内容:
,最后只输入文件名:
file *.jpg | grep -v "JPEG image data" | sed 's/:.*//'
..这是我的bash-fu的结束。此时,我将结果列表存储在一个文件中(添加> list
)并在文本编辑器中使用GREP将所有行重写为正确的重命名命令,然后运行该命令。
答案 4 :(得分:0)
我不确定bash脚本的相应命令,但您可以轻松编写C ++文件以尝试打开这些文件并捕获错误。您捕获错误的文件将不是合适的类型(假设这是您唯一的问题)。如果您知道那些不正确的文件类型应为PNG,则可以重命名该文件。类似伪代码的东西:
For (ALL_FILES)
{
try
{
open(FILENAME);
}
catch
{
rename(FILENAME, NEW_FILENAME);
}
}