2017-10-05 42 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 
相關問題