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

时间:2017-10-05 13:08:11

标签: linux bash shell sh

我想保留文件但删除其扩展名。这些文件没有相同的扩展名。我的最终目标是删除所有扩展并将其更改为我选择的一个扩展。我把第二部分放下了。

到目前为止我的代码:

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

3 个答案:

答案 0 :(得分:6)

您不需要外部命令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" ]条件通过退出循环来保护这一点。如果前一个命令失败,则在复合语句中使用||将运行,因此当下一次命中continue时,for循环终止。

如果您想添加新的扩展程序,请执行

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

答案 1 :(得分:1)

这也可能是一种方式

static myArray = [1, 2, 3];

答案 2 :(得分:0)

您可能想尝试以下操作。它使用find和awk with 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"")}'