2011-11-25 48 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'变量的内容。 –

相关问题