管道输出“file”到“mv”以重命名带有文件扩展名

时间:2016-05-16 16:06:01

标签: bash

以下情况: 包含许多不同图像文件的文件夹:jpeg,png,gif file *的输出类似于:

filename1: png image data, 300 x 300, some more information bla bla
filename2: gif image data, 300 x 300, some more information bla bla
filename3: jpeg image data, 300 x 300, some more information bla bla

现在,最好的方法是在文件中添加后缀(如image.png),因为这些文件的名称类似于“avatar_pobmglinmphfhbiffgmdmphklcbjolklmnaeblbk”。 所以问题是没有选项(afaik)命令“file”只能输出文件类型和文件名/ -path

我的想象力是管道或查找-exec与文件内部。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用readprocess substitution

while IFS=' ' read img ext n; do
  mv ${img%:} ${img%:}.${ext}
done < <(file *)

${img%:}语法是shell parameter expansion的一部分。它从图像名称中删除尾随:

进程替换<(file *)允许将命令输出作为文件处理。此处将file *输出重定向为read命令的输入。

答案 1 :(得分:1)

您可以使用mv + cut

IFS=$'\n'
for line in $(file *); do 
  filename=$(echo $line | cut -d: -f1)
  extension=$(echo $line | cut -d' ' -f2)
  mv $filename "${filename}.${extension}"
done