2011-11-25 46 views
1

將數小時後,我放棄,並尋求幫助。這已在前面的SO問題中得到完美回答:How do I rename all files to lowercase?小寫或重命名Mac OS X上的目錄中的所有文件

問題是,它在Mac OS X上無法正常工作。所以我開始着手重做它,以便它可以工作。瞭解到強/弱的引用,我認爲這與它有關。就目前而言,我在所有方面都使用強烈的引用。

#!/bin/bash 
echo ""; echo "Start run `basename $0` on `date`"; 
echo "Script running from: `pwd`"; 

# Change into the directory with the files to rename 
cd /Users/me/Desktop/files 
echo "Working on files in: `pwd`"; echo ""; 


# Read in all files from a directory 
for file in *; do 
     lowercase_filename=`echo $file | tr '[:upper:]' '[:lower:]'`; 
     echo \'$file\' \'$lowercase_filename\'; 

     mv \'$file\' \'$lowercase_filename\'; 
     echo "--------------------"; 

done 

這裏是上面的腳本運行時輸出:

./renamer.sh 

Start run renamer.sh on Fri Nov 25 04:35:00 PST 2011 
Script running from: /Users/me/Desktop 
Working on files in: /Users/me/Desktop/files 

'This IS A test TEST.txt' 'this is a test test.txt' 
usage: mv [-f | -i | -n] [-v] source target 
     mv [-f | -i | -n] [-v] source ... directory 

出於某種原因,mv不起作用。但是,奇怪的是,如果我使用調試輸出並手動運行它,它將正常工作。所以我有一個前後字符串的文件名,在這種情況下,前者是混合大小寫,後者是小寫。這些字符串以單個的tic標記引用。我將它們回顯出來,就像我將它們作爲兩條參數傳遞給mv命令一樣。

'This IS A test TEST.txt' 'this is a test test.txt' 

的劇本給我一個錯誤,但如果我用手工運行這些命令:

# "l" is an alias for ls with some args to remove fot files 
# and other junk I don't want to see. 

[email protected]:\ $cd files 
[email protected]:\ $l 
-rw-r--r--+ 1 me staff  0 Nov 25 03:49 This IS A test TEST.txt 
[email protected]:\ $mv 'This IS A test TEST.txt' 'this is a test test.txt' 
[email protected]:\ $l 
-rw-r--r--+ 1 me staff  0 Nov 25 03:49 this is a test test.txt 

正如你所看到的文件是用小寫就好更名爲「這是一個測試的考驗。文本」。如果我可以手動使用mv,那麼腳本環境中會發生一些讓它感到困惑的事情。任何想法可能是什麼?

我應該可以像其他海報做的一樣,但無論我嘗試什麼,它都不適合我。

感謝您的任何指導。我在Mac OS X上,這裏是一些相關的系統信息...

$uname -a 
Darwin whitebook.local 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug 9 20:56:15 PDT 2011; root:xnu-1699.24.8~1/RELEASE_I386 i386 


$bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11) 
Copyright (C) 2007 Free Software Foundation, Inc. 
+0

這是一個更適合superusers.com的問題,我想。 –

+0

這是我最後的腳本,以防Mac OS X Lion或者更低版本的人正在尋找這種能力。我計劃添加--convertspaces更改「」爲「_」和--uppercase, - 序列(添加1. 2. 3.引導文件名,--aFewMoreIHaventTHoughtOf。 這只是我學習中的一個部分一些bash,所以它可能不是完全理想的,但我想學習一些東西,這個當前腳本可以小寫文件和目錄,當與同名目錄衝突時不會錯誤,並且離開Mac OS X前導點文件(隱形)獨自 – user170579

+0

你可以從這裏下載最終(我感覺工作的)腳本:http://pastie.org/2943374將它複製到一個文本文件中,我稱之爲'lcaser'和chmod u + x,然後運行它作爲./lcaser/path/to/files,或者如果它在你的$ PATH中,你不需要./,並且可以使用lcaser/path/to/files – user170579

回答

4

你能試試嗎?

mv "$file" "$lowercase_filename"; 
+0

嗯,那個工作!你能詳細說明這裏發生了什麼嗎?我發誓我嘗試過,儘管我嘗試了這樣的人我不能肯定地說出不同的東西。謝謝。 – user170579

+1

@ user170579:由於您在版本中跳過了單引號,因此不會將它們視爲功能引號,只是作爲其參數的一部分將misc字符傳遞給'mv'。因此,'mv'正在尋找名爲「'This」,「IS」,「A」,「test」,「TEST.txt」,「this」等的文件。 –

+1

基本上,當一個變量用雙引號它得到擴展。 'echo'$ file''會輸出'$ file',而'echo'$ file''會輸出'$ file'變量的內容。 –

相關問題