BASH-基于文件类型重命名图片

BASH-基于文件类型重命名图片,bash,Bash,我在这里有点沮丧,因为我试图让一个简单的bash脚本正常运行。我认为这是由于文件名很长,或者文件中有空格 简言之,我试图从file命令中提取数据,并将目录中的图片重命名为其正确的文件类型,因为有些图片似乎被错误标记。例如,一个.png文件实际上是一个.jpg文件。这会导致一些图像查看器不显示它们。这是我正在使用的脚本 #!/bin/bash for NAME in $(ls); do if [ "$(file $NAME|grep GIF)" ]; then echo "Renaming $

我在这里有点沮丧,因为我试图让一个简单的bash脚本正常运行。我认为这是由于文件名很长,或者文件中有空格

简言之,我试图从file命令中提取数据,并将目录中的图片重命名为其正确的文件类型,因为有些图片似乎被错误标记。例如,一个.png文件实际上是一个.jpg文件。这会导致一些图像查看器不显示它们。这是我正在使用的脚本

#!/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)相似。这非常好,工作完美,对我来说很有意义。非常感谢你!谢谢,这是有道理的,有助于澄清我的理解:)谢谢,这是有道理的,有助于澄清我的理解:)