没注意到要改目录名,加上改目录名的功能,用下面代码:
#!/bin/sh
#使用bash做为默认shell
#create by Alpha @2010-01-08
#本程序的功能是遍历指定目录及其所有子目录,将所有子目录、文件名中的空格替换为下划线
#convert whitesapce to '_' in file name
rename_file()
{
for file in "$1"/*
do
if [ -d "$file" ]; then
rename_file "$file" #递归调用,遍历所有子目录
elif [ -f "$file" ]; then
dir=`dirname "$file"`
filename=`basename "$file"`
#echo "dir is ""$dir"
#echo "$filename"
#new file name
oldname=$filename
newname=
for sub in $filename
do
if [ $newname ]; then
newname=$newname"_"$sub
else
newname=$sub
fi
done
#rename file
if [ "$newname" != "$oldname" ]; then #file name changed
if [ ! -f "$dir/$newname" ]; then #file not exist, do rename
echo "rename file '$dir/$oldname' to '$dir/$newname'"
mv "$dir/$oldname" "$dir/$newname" #rename file
else #file exist
echo "file exist: can not rename file '$dir/$oldname' to '$dir/$newname'"
fi
else
echo "file '$dir/$oldname' do not need rename."
fi
fi
done
}
#convert whitesapce to '_' in dir name
rename_dir()
{
for file in "$1"/*
do
if [ ! -d "$file" ]; then
continue
fi
#new dir name
olddir=$file
newdir=
for sub in $file
do
if [ $newdir ]; then
newdir=$newdir"_"$sub
else
newdir=$sub
fi
done
#rename dir
if [ "$newdir" != "$olddir" ]; then #dir name changed
if [ ! -d "$newdir" -a ! -f "$newdir" ]; then #file not exist, do rename
echo "rename dir '$olddir' to '$newdir'"
mv "$olddir" "$newdir" #rename dir
else #file exist
echo "file exist: can not rename dir '$oledir' to '$newdir'"
newdir=$olddir #change var newdir for recurring
fi
else
echo "dir '$olddir' do not need rename."
newdir=$olddir #change var newdir for recurring
fi
rename_dir "$newdir" #递归
done
}
#main begin
if [ $# -gt 0 ]; then
echo "All files which filename have whitesapce in folder '$1' will be rename."
else
echo "All files which filename have whitesapce in folder '.' will be rename."
fi
echo "Continue [y/n]?: \c"
read confirm
while [ "$confirm" != "y" ]
do
if [ "$confirm" = "n" ]; then
exit 0
fi
echo "Continue [y/n]?: \c"
read confirm
done
#do rename
if [ $# -gt 0 ]; then
rename_file "$1"
rename_dir "$1"
else
rename_file "."
rename_dir "."
fi
<<<<<<<<----------以上是最新的-------------
xunknown 写了:用下面在脚本,经过测试:
#!/bin/sh
#使用bash做为默认shell
#create by Alpha @2010-01-08
#本程序的功能是遍历指定目录及其所有子目录,将所有文件名(目录除外)中的空格替换为下划线,
#convert whitesapce to '_' in filename
rename()
{
for file in "$1"/*
do
if [ -d "$file" ]; then
rename "$file" #递归调用,遍历所有子目录
elif [ -f "$file" ]; then
dir=`dirname "$file"`
filename=`basename "$file"`
#echo "dir is ""$dir"
#echo "$filename"
oldname=$filename
newname=
#
for sub in $filename
do
if [ $newname ]; then
newname=$newname"_"$sub
else
newname=$sub
fi
done
if [ "$newname" != "$oldname" ]; then #filename changed
if [ ! -f "$dir/$newname" ]; then #new file not exist
echo "rename file '$dir/$oldname' to '$dir/$newname'"
mv "$dir/$oldname" "$dir/$newname" #rename file
else #new file exist
echo "file exist: can not rename file '$dir/$oldname' to '$dir/$newname'"
fi
else
echo "file '$dir/$oldname' do not need rename."
fi
fi
done
}
#main begin
if [ $# -gt 0 ]; then
echo "All files which filename have whitesapce in folder '$1' and its subfolder will be rename."
else
echo "All files which filename have whitesapce in folder '.' and its subfolder will be rename."
fi
echo "Continue [y/n]?: \c"
read confirm
while [ "$confirm" != "y" ]
do
if [ "$confirm" = "n" ]; then
exit 0
fi
echo "Continue [y/n]?: \c"
read confirm
done
#do rename
if [ $# -gt 0 ]; then
rename "$1"
else
rename "."
fi