BASH-基于文件类型重命名图片
我在这里有点沮丧,因为我试图让一个简单的bash脚本正常运行。我认为这是由于文件名很长,或者文件中有空格 简言之,我试图从file命令中提取数据,并将目录中的图片重命名为其正确的文件类型,因为有些图片似乎被错误标记。例如,一个.png文件实际上是一个.jpg文件。这会导致一些图像查看器不显示它们。这是我正在使用的脚本BASH-基于文件类型重命名图片,bash,Bash,我在这里有点沮丧,因为我试图让一个简单的bash脚本正常运行。我认为这是由于文件名很长,或者文件中有空格 简言之,我试图从file命令中提取数据,并将目录中的图片重命名为其正确的文件类型,因为有些图片似乎被错误标记。例如,一个.png文件实际上是一个.jpg文件。这会导致一些图像查看器不显示它们。这是我正在使用的脚本 #!/bin/bash for NAME in $(ls); do if [ "$(file $NAME|grep GIF)" ]; then echo "Renaming $
#!/bin/bash
for NAME in $(ls); do
if [ "$(file $NAME|grep GIF)" ]; then
echo "Renaming ${NAME} to ${NAME%.*}.gif"
mv ${NAME} ${NAME%.*}.gif
elif [ "$(file $NAME|grep JPG)" ]; then
echo "Renaming ${NAME} to ${NAME%.*}.jpg"
mv ${NAME} ${NAME%.*}.jpg
elif [ "$(file $NAME|grep PNG)" ]; then
echo "Renaming ${NAME} to ${NAME%.*}.png"
mv ${NAME} ${NAME%.*}.png
else
echo "No Change For ${NAME}"
fi
done
最后的回音只是想看看它为什么失败,这就是我看到的:
No Change For 20097489744.jpeg
No Change For 24902583463
然后它就挂了,为什么?因为我相信文件包含空格。。。我查看了一下通过增加文件名来批量重命名目录中的所有文件,即:1.jpg 2.png 3.gif。然而,我在网上发现的一切都不是增加文件重命名作业,而是从名称中删除数字等。。所以,我碰上了一堵墙,没有手动重命名130K文件(不会发生!哈哈)
我非常感谢那些智囊团的意见
谢谢,节日快乐 整个过程中都需要适当的报价。如果您有
${NAME}
,请将其更改为“${NAME}”
(或等效为“$NAME”
)。如果您有一个空的$NAME
,也将其更改为“$NAME”
。等等
另外,$(ls)中名称的是错误的;您最可能的意思是*
中的名称为
最后,您可能希望替换if[“$(文件$NAME | grep GIF)”;然后
。。。如果文件“$NAME”| grep-qgif;然后
。。。(这一点最初是在@phs的回答中提出的,现在已被删除。)你需要在整个过程中正确引用。如果您有${NAME}
,请将其更改为“${NAME}”
(或等效为“$NAME”
)。如果您有一个空的$NAME
,也将其更改为“$NAME”
。等等
另外,$(ls)中名称的是错误的;您最可能的意思是*
中的名称为
最后,您可能希望替换if[“$(文件$NAME | grep GIF)”;然后
。。。如果文件“$NAME”| grep-qgif;然后
。。。(这最初是在@phs的回答中提出的,现在已删除。)如果您的文件名包含空格,请使用:
mv "$NAME" "${NAME%.*}.png"
顺便说一下
[ "$(file $NAME|grep GIF)" ];
可以使用以下命令保存子进程:
[[ $(file $NAME) == *GIF ]];
使用
grep
时,您可能应该使用grep'GIF$'
,否则它会在文件名的任何位置找到GIF 如果文件名包含空格,请使用:
mv "$NAME" "${NAME%.*}.png"
顺便说一下
[ "$(file $NAME|grep GIF)" ];
可以使用以下命令保存子进程:
[[ $(file $NAME) == *GIF ]];
使用
grep
时,您可能应该使用grep'GIF$'
,否则它会在文件名的任何位置找到GIF 下面是一个完整的shell脚本解决方案,它处理包含空格和大小写的文件名:
#!/bin/bash
ls | while read NAME ; do
FILE_NAME="${NAME%.*}"
FILE_EXT="${NAME##*.}"
case $(file "$NAME") in
*GIF* ) NEW_EXT='gif' ;;
*JPEG* ) NEW_EXT='jpg' ;;
*PNG* ) NEW_EXT='png' ;;
* ) NEW_EXT='' ;;
esac
if [[ -n "${NEW_EXT}" && "${FILE_EXT}" != "${NEW_EXT}" ]] ; then
echo "Renaming ${NAME} to ${FILE_NAME}.${NEW_EXT}"
mv "${NAME}" "${FILE_NAME}.${NEW_EXT}"
else
echo "No Change For ${NAME}"
fi
done
我有意让它保持简单,但如果您有任何问题请告诉我这里有一个完整的shell脚本解决方案,它可以处理包含空格和用例的文件名:
#!/bin/bash
ls | while read NAME ; do
FILE_NAME="${NAME%.*}"
FILE_EXT="${NAME##*.}"
case $(file "$NAME") in
*GIF* ) NEW_EXT='gif' ;;
*JPEG* ) NEW_EXT='jpg' ;;
*PNG* ) NEW_EXT='png' ;;
* ) NEW_EXT='' ;;
esac
if [[ -n "${NEW_EXT}" && "${FILE_EXT}" != "${NEW_EXT}" ]] ; then
echo "Renaming ${NAME} to ${FILE_NAME}.${NEW_EXT}"
mv "${NAME}" "${FILE_NAME}.${NEW_EXT}"
else
echo "No Change For ${NAME}"
fi
done
我有意让它保持简单,但如果您有任何问题,请告诉我。如果您安装了ImageMagick,您可以尝试使用标识命令 例如,如果24902583463.png文件实际上是一个.jpg文件,则可以执行: 一体式脚本:
ls | while read NAME ; do
identify -quiet "$NAME";
if [ "$?" -eq "0" ]
then
FILE_NAME=$(identify -format "%t" "$NAME");
FILE_EXT=$(identify -format "%e" "$NAME");
FILE_TYPE=$(identify -format "%m" "$NAME" | tr '[:upper:]' '[:lower:]');
if [ $FILE_EXT != $FILE_TYPE ];
then
mv "$NAME" "${FILE_NAME}.${FILE_TYPE}";
fi
fi
done
如果已安装ImageMagick,可以尝试使用标识命令 例如,如果24902583463.png文件实际上是一个.jpg文件,则可以执行: 一体式脚本:
ls | while read NAME ; do
identify -quiet "$NAME";
if [ "$?" -eq "0" ]
then
FILE_NAME=$(identify -format "%t" "$NAME");
FILE_EXT=$(identify -format "%e" "$NAME");
FILE_TYPE=$(identify -format "%m" "$NAME" | tr '[:upper:]' '[:lower:]');
if [ $FILE_EXT != $FILE_TYPE ];
then
mv "$NAME" "${FILE_NAME}.${FILE_TYPE}";
fi
fi
done
如果文件名中可能有空格,请确保将变量用引号括起来。e、 g.
mv“${NAME}”“${NAME%.*}.gif”
,也可以使用grep-i
使搜索不区分大小写。如果文件名中可能有空格,请确保将变量用引号括起来。e、 g.mv“${NAME}”“${NAME%.*}.gif”
,也可以使用grep-i
使搜索不区分大小写。在*
中查找NAME更好,因为它可以避免,尽管只有一个简单的文件目录,您应该可以。当然,同意。但我故意让它与OP最初的做法(使用ls)相似。这非常好,工作完美,对我来说很有意义。多谢各位<对于*中的NAME,code>更好,因为它可以避免,虽然只有一个简单的文件目录,但应该可以。当然,同意。但我故意让它与OP最初的做法(使用ls)相似。这非常好,工作完美,对我来说很有意义。非常感谢你!谢谢,这是有道理的,有助于澄清我的理解:)谢谢,这是有道理的,有助于澄清我的理解:)