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

5
我想保留文件但删除它们的扩展名,这些文件没有相同的扩展名。我的最终目标是删除所有扩展名并将它们更改为我选择的一个单一扩展名。我已经实现了第二部分。
我目前的代码:
#!/bin/bash
echo -n "Enter the directory: "
read path
            #Remove all extensions
find $path -type f -exec mv '{}' '{}'.extension \; #add desired extension
3个回答

12

你不需要外部命令 find,而只需在 bash 中完成。下面的脚本将从文件夹 path 中删除所有文件的扩展名。

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

使用[ -f "$file" ]只是为了进行安全检查。通配符表达式“$path/*”可能不会列出任何文件,在这种情况下,mv命令将失败,因为没有文件。[ -f "$file" ] || continue条件通过在$file变量为空时退出循环来保护此操作,此时[ -f "$file" ]返回一个失败的错误代码。当用于复合语句时,||会在前一个命令失败时运行,因此,当下一个命令为continue时,for循环将终止。

如果想要添加新扩展名,只需执行

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

“[ -f "$file" ] || continue” 这段代码是用来检查文件是否存在的吗? - Zantorym
@Jaspreet:这是一个全局模式,用于列出当前文件夹中的所有文件。您可能需要阅读Bash - Glob Patterns - Inian
在重命名所有文件之前,先测试脚本 :) for file in ; do [ -f "$file" ] && { echo "${file%.}"; }; done - roblogic
根据我之前的评论,可以用更简单的AND && { }替换多余的OR条件|| continue - roblogic

1
这也可以是一种方式。
for i in `find . -type f `;do  filename=`ls $i | cut -f 2 -d "."`;  mv $i ./$filename.ext; done

0
你可能想尝试以下方法。它使用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"")}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接