蔭嘗試一個shell腳本會在當前目錄名稱中包含大寫字符轉換成小寫的所有文件重命名重命名的所有文件。例如,如果目錄包含名稱爲CoUnt.c的文件,則應將其重命名爲count.c。在當前目錄下,其名稱conatains大寫變成小寫
for f in *;
do
if [ -f "$f" ]; then
tr 'A-Z' 'a-z'
fi
done
但它不工作。 有沒有更好的解決方案呢?
蔭嘗試一個shell腳本會在當前目錄名稱中包含大寫字符轉換成小寫的所有文件重命名重命名的所有文件。例如,如果目錄包含名稱爲CoUnt.c的文件,則應將其重命名爲count.c。在當前目錄下,其名稱conatains大寫變成小寫
for f in *;
do
if [ -f "$f" ]; then
tr 'A-Z' 'a-z'
fi
done
但它不工作。 有沒有更好的解決方案呢?
的問題是從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
(注:去掉echo
前mv
實際移動的文件,您滿意的手術後)
您沒有將任何數據傳入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
沒有用bash化作弊! ';-)'但我喜歡包含大寫的文件名的限制。 –
@ DavidC.Rankin:公平的,但我沒有給一個POSIX解決方案第一:-) – cdarke
下面的代碼工作正常。
for f in *
do
if [ -f $f ]; then
echo "$f" | tr 'A-Z' 'a-z' >/dev/null
fi
done
既然我無法添加評論張貼在這裏, 使用SED和它的作品對我來說
#!/斌/慶典
for i in *
do
if [ -f $i ]
then
kar=$(echo "$i" | sed 's/.*/ \L&/')
mv "$i" "$kar"
done
您應該添加雙引號的情況下,文件名包含空格的所有訪問變量,所以'「$ I」'和'「$ KAR 「'。 –
'rename(1)'特定於Linux,並非所有版本都支持您顯示的選項。 – cdarke
@cdarke AFAIK,它是一個Perl腳本,如果安裝了Perl,它可以在Linux,Unix和OS X和Windows上運行。我相信我所建議的第二種格式/語法在所有這些平臺上都受支持。 –
重命名命令是用C語言編寫的。它是util-linux軟件包的一部分,可從ftp://ftp.kernel.org/pub/linux/utils/util-linux/獲得。內核接口'rename(2)'是底層的API,並且有一個名爲內置的Perl,但事實並非如此。我在安裝了Perl的OS X上運行,並且沒有重命名命令行實用程序。 – cdarke
嘗試,http://stackoverflow.com/questions/20253584/linux-rename-files-to-uppercase –