2016-07-29 34 views
0

蔭嘗試一個shell腳本會在當前目錄名稱中包含大寫字符轉換成小寫的所有文件重命名重命名的所有文件。例如,如果目錄包含名稱爲CoUnt.c的文件,則應將其重命名爲count.c。在當前目錄下,其名稱conatains大寫變成小寫

for f in *; 
do 
if [ -f "$f" ]; then 
tr 'A-Z' 'a-z' 
fi 
done 

但它不工作。 有沒有更好的解決方案呢?

+0

嘗試,http://stackoverflow.com/questions/20253584/linux-rename-files-to-uppercase –

回答

2

的問題是從tr接受stdin值。因此,爲了在每個文件名上轉換爲低,你可以這樣做:

#!/bin/sh 

for f in * 
do 
    [ -f "$f" ] || continue 
    flc=$(echo "$f" | tr 'A-Z' 'a-z')   ## form lower-case name 
    [ "$f" != "$flc" ] && echo mv "$f" "$flc" 
done 

(注:去掉echomv實際移動的文件,您滿意的手術後)

2

您沒有將任何數據傳入tr程序,並且您也沒有捕獲任何輸出。

如果您正在使用sh

for f in *[A-Z]* 
do 
    if [ -f "$f" ]; then 
     new_name=$(echo "$f"|tr 'A-Z' 'a-z') 
     mv "$f" "$new_name" 
    fi 
done 

注壓痕 - 它使代碼更易於閱讀。

如果您正在使用bash就沒有必要使用外部程序像tr,你可以使用bash擴展:

for f in *[A-Z]* 
do 
    if [[ -f $f ]]; then 
     new_name=${f,,*} 
     mv "$f" "$new_name" 
    fi 
done 
+0

沒有用bash化作弊! ';-)'但我喜歡包含大寫的文件名的限制。 –

+1

@ DavidC.Rankin:公平的,但我沒有給一個POSIX解決方案第一:-) – cdarke

1

下面的代碼工作正常。

for f in * 
do 
if [ -f $f ]; then 
    echo "$f" | tr 'A-Z' 'a-z' >/dev/null 
fi 
done 
2

既然我無法添加評論張貼在這裏, 使用SED和它的作品對我來說

#!/斌/慶典

for i in * 
do 
if [ -f $i ] 
then 
kar=$(echo "$i" | sed 's/.*/ \L&/') 
mv "$i" "$kar" 
done 
+0

您應該添加雙引號的情況下,文件名包含空格的所有訪問變量,所以'「$ I」'和'「$ KAR 「'。 –

1

我會建議rename因爲它簡單,高效,也會檢查衝突時兩個不同的文件解析到相同的結果:

你可以用一個Perl的正則表達式使用它:

rename 'y/A-Z/a-z/' * 

可用的文檔和示例here

+0

'rename(1)'特定於Linux,並非所有版本都支持您顯示的選項。 – cdarke

+0

@cdarke AFAIK,它是一個Perl腳本,如果安裝了Perl,它可以在Linux,Unix和OS X和Windows上運行。我相信我所建議的第二種格式/語法在所有這些平臺上都受支持。 –

+0

重命名命令是用C語言編寫的。它是util-linux軟件包的一部分,可從ftp://ftp.kernel.org/pub/linux/utils/util-linux/獲得。內核接口'rename(2)'是底層的API,並且有一個名爲內置的Perl,但事實並非如此。我在安裝了Perl的OS X上運行,並且沒有重命名命令行實用程序。 – cdarke