Bash 管道输出;文件";至;mv";重命名具有文件扩展名的文件

Bash 管道输出;文件";至;mv";重命名具有文件扩展名的文件,bash,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 bl

以下情况: 包含许多不同图像文件的文件夹: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_pobmglinmphfhbifgfgmdphklcbjollmnaeblbk”。 因此,问题是命令“file”没有选项(afaik)只输出文件类型和文件名/路径

我的想象是一些管道或者里面有文件的find-exec


非常感谢您的帮助

您可以使用
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

使用
读取
和:

而IFS=''读取img ext n;做
mv${img%:}${img%:}.${ext}

done
命令的输出是人类可读的,不一定是机器可解析的。如果您能够解析它的输出,我建议您使用它来创建一个脚本,在执行它之前仔细检查它;然后脚本将重命名文件。这是一个脚本解决方案,不是吗?我可以直接在bashshell中用一行程序写这个吗?类似于:对于$(文件*)中的行;do filename=$(echo$line | cut-f1 | tr-d':')和&mv$filename“${filename}.${extension}”;完成;是这样吗?谢谢1)您可以在bashshell中编写这篇文章,而无需将其制作成一行程序;2) 对于$(file*)中的行,更好的1-liner应该是
;DoMV$(echo$行| cut-f1 | tr-d':')“$(echo$行| cut-f1 | tr-d':')。$(echo$行| cut-f2)”;完成
但是是的,你的看起来很正确它不起作用
mv:rename PNG to PNG.PNG:No-this file or directory mv:rename image to image.image:No-this file or directory mv:rename data.data,:No-this file or directory mv:rename 300 to 300.300:No-this file or directory mv:rename x to x.x:No-this file or directory
看起来cut-f1/-f2部分有什么不正确的地方(s)…好的,有两个问题:
for
在单词而不是行上循环,以及
cut
在制表符而不是空格上循环;我已经更新了我的答案来解释这两个问题。非常感谢,它很有效!我尝试在第一个cut命令中用冒号替换tr命令作为delimter,因此类似于:
IFS=$'\n'&&for line在$(file*);do filename=$(echo$line | cut-d:-f1)和&extension=$(echo$line | cut-d''-f2)和&mv$filename“${filename}.${extension}”中,完成了
您是否使用tr命令允许文件名中使用冒号?另一个问题是,为什么我需要在mv的后半部分使用花括号?
mv$filename“${filename}.${extension}”
?这是不是要用变量而不是bash的$filename?(是bash的$filename吗?)非常感谢!我几乎什么都懂(对循环的经验很少),除了花括号中冒号前面的%和IFS设置为空格).有效!非常感谢!是n变量吗(我想是一个?)要捕获在这个用法中是垃圾的其余行,或者还有其他事情要做?此外,我将阅读
read
中的man,以更好地了解这个循环中的所有内容。非常感谢您的帮助!不客气!您对
n
变量的理解是正确的,它只是用于捕获其余行,没有别的了。
while IFS=' ' read img ext n; do
  mv ${img%:} ${img%:}.${ext}
done < <(file *)