使用bash,我如何删除特定目录中所有文件的扩展名?

我想保留这些文件,但删除它们的扩展名。 这些文件没有相同的扩展名。 我的最终目标是删除所有扩展名,并将其更改为我select的一个扩展名。 我有第二部分。

我的代码到目前为止:

#!/bin/bash echo -n "Enter the directory: " read path #Remove all extensions find $path -type f -exec mv '{}' '{}'.extension \; #add desired extension 

你不需要一个外部命令find这个,但单独在bash 。 下面的脚本删除文件夹path所有文件的扩展名。

 for file in "$path"/*; do [ -f "$file" ] || continue mv "$file" "${file%.*}" done 

使用[ -f "$file" ]原因仅用于安全检查。 glob表达式“$ path”/ *最终可能没有列出任何文件,在这种情况下, mv命令会失败,因为没有文件。 [ -f "$file" ] || continue 如果$file变量为空, [ -f "$file" ]返回失败错误代码,则通过退出循环来[ -f "$file" ] || continue条件。 || 当在复合语句中使用时,如果前一个命令失败,将会运行,所以当continue下一个命令时,for循环终止。

如果你想添加一个新的扩展只是做

 mv "$file" "${file%.*}.extension" 

这也可以是一种方式

 for i in `find . -type f `;do filename=`ls $i | cut -f 2 -d "."`; mv $i ./$filename.ext; done 

你可能想尝试下面的。 它使用find和awk和system()来删除扩展名:

 find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}' 

例:

 [root@puppet:0 check]# ls -lrt total 0 -rw-r--r--. 1 root root 0 Oct 5 13:49 abc.ext -rw-r--r--. 1 root root 0 Oct 5 13:49 something.gz [root@puppet:0 check]# find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}' [root@puppet:0 check]# ls -lrt total 0 -rw-r--r--. 1 root root 0 Oct 5 13:49 abc -rw-r--r--. 1 root root 0 Oct 5 13:49 something 

另外,如果您有要添加到所有文件的特定扩展名,则可以修改该命令,如下所示:

 find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS=".";ext=".png"}{system("mv "$0" ./"$1ext"")}'