在花了几个小时之后,我放弃了,并寻求帮助。这已经在之前的 SO 问题中得到了完美的回答:如何将所有文件重命名为小写?
问题是,它在 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
不起作用。但是,奇怪的是,如果我获取调试输出并手动运行它,它会正常工作。所以我有一个文件名的前后字符串,在这种情况下,前面是混合大小写,后面是小写。字符串用单引号引起来。我回显它们,就像我将它们作为两个参数传递给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.
me@whitebook:\ $cd files
me@whitebook:\ $l
-rw-r--r--+ 1 me staff 0 Nov 25 03:49 This IS A test TEST.txt
me@whitebook:\ $mv 'This IS A test TEST.txt' 'this is a test test.txt'
me@whitebook:\ $l
-rw-r--r--+ 1 me staff 0 Nov 25 03:49 this is a test test.txt
如您所见,该文件已用小写重命名为“这是一个测试 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.