2017-10-05 39 views
2

我想保留这些文件但删除它们的扩展名。这些文件没有相同的扩展名。我的最终目标是删除所有扩展名,并将其更改为我选择的单个扩展名。我有第二部分。使用bash,我如何删除特定目录中所有文件的扩展名?

我迄今为止代码:

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

回答

5

你并不需要为这个外部命令find,但这样做在单独bash。以下脚本将文件夹path中的所有文件的扩展名删除。

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

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

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

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

是否“[-f”$ file“] ||继续“检查它是否有文件? – Jaspreet

+0

@Jaspreet:这是一个用于列出当前文件夹中所有文件的glob模式,您可能需要阅读[Bash - Glob Patterns](http://mywiki.wooledge.org/BashGuide /格式) – Inian

+0

'在文件中*; do [-f“$ file”] && {echo“$ {file%。*}”;}; done' - 在重命名所有文件之前测试脚本:) – ropata

0

你可能想尝试以下。它使用查找和使用系统()awk来删除扩展:

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

例如:

[[email protected]: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 
[[email protected]:0 check]# find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}' 
[[email protected]: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"")}' 
1

这也可能是一种方式

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