当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 18 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-07 14:20 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
这个问题还有点小难的,我想不到好一点的方法

从光盘上拷来一个文件夹,文件夹包含子目录,子目录里面又有文件,反正还挺多的,好几层~~
这里面的目录名和文件名,有不少包含空格

我想要把目录名、文件名中的空格全部去掉,各位有什么好办法不?

我一开始的想法是find . -name "*", 然后把找到的文件列表传给mv。 实际这样做不行,因为会出现把目录名改了以后,原来find出来的文件路径已经改掉了,mv就不成功了……(囧,我讲清楚没有?)

先谢谢啦:)


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-07 14:30 

注册: 2010-01-04 13:55
帖子: 40
送出感谢: 0 次
接收感谢: 0 次
不晓得,帮你顶一下。 :em09


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-07 14:38 
头像

注册: 2007-10-19 14:51
帖子: 4953
地址: 深圳
送出感谢: 0 次
接收感谢: 2
代码:
for filename in `find . -name "*"`
do newname="${filename// /}"
newdirname=`dirname $newname`
mkdir -p /newdir/"$newdirname"
cp -v "$filename" /newdir/"$newname"
done


_________________
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-07 15:26 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
yaoms 写道:
代码:
for filename in `find . -name "*"`
do newname="${filename// /}"
newdirname=`dirname $newname`
mkdir -p /newdir/"$newdirname"
cp -v "$filename" /newdir/"$newname"
done


谢谢yaoms,不过可能有点问题,在for filename in `find . -name "*"`这里,find出来的文件名里面已经包含空格了,比如“a b",$filename会得到两次值,一个是a,一个是b...


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-07 16:38 
头像

注册: 2009-09-18 10:03
帖子: 90
地址: 北京
送出感谢: 0 次
接收感谢: 0 次
试试
代码:
 rename 's/([^\ ]*) +(.*)/$1$2/' *


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-07 16:42 
头像

注册: 2009-09-18 10:03
帖子: 90
地址: 北京
送出感谢: 0 次
接收感谢: 0 次
哦,也有问题,只能是一串空格隔开的文件名。(如果反复用N次的话,应该可以解决,嘿嘿)


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 0:19 
头像

注册: 2010-01-03 20:04
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
用下面在脚本,经过测试:

#!/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


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 1:49 
头像

注册: 2010-01-03 20:04
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
没注意到要改目录名,加上改目录名的功能,用下面代码:

#!/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


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 8:39 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
?????????这么复杂??
rename 's/\ //g' * 不行吗?


_________________
● 鸣学


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 10:45 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
eexpress 写道:
?????????这么复杂??
rename 's/\ //g' * 不行吗?


光靠这行貌似不行~


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 10:51 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
说下。为什么不行。
find可带-exec bash -c '' \;
那''里面可以调用rename xxxx {}的。
怎么样,都是一行代码


_________________
● 鸣学


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 10:59 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
谢谢xunknown的帮助

试了一下你的脚本,好像子目录的名字没有全部改过来,你看看是不是哪里漏了?仍然很感谢你,你的脚本也给我带来了启发 :em01

自己写了一个,

代码:
#!/bin/bash

modifyname()
{
    if [ -d "$1" ]  #directory
    then
        for files in "$1"/*
        do
            modifyname "$files"
        done
    fi
    bname=`basename "$1"`
        echo $bname | grep -q " " #chech if contains blank
        if [ $? -eq 0 ]
    then
        dname=`dirname "$1"`
        newname=$dname/${bname// /_}
        mv -v "$1" "$newname"
    fi
}

[ -e "$1" ] || { echo "$1 does not exist"; exit 1; }

modifyname "$1"
exit 0


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 11:20 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
eexpress 写道:
说下。为什么不行。
find可带-exec bash -c '' \;
那''里面可以调用rename xxxx {}的。
怎么样,都是一行代码


谢谢小e~~
比如原本有a a/b b b/c c c c
find出来的效果是这样的
./a a
./a a/b b b
./a a/b b b/c c c c
这样先把a a的名字给改了以后,./a a/b b b就不存在了吧?所以rename的时候会出错?

然后我就改成了这样:
find . -name "*" | tac | xargs -I{} rename ' ' '_' {}
还是不行——我测试的时候建了几重文件夹,胡乱放了几个文件,反正有一些没有改过来

另外,那个 rename 's/\ //g' {} 我不太懂……rename不是要三个参数的吗?这里面……

谢谢ee:)


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 13:31 
头像

注册: 2009-02-22 14:15
帖子: 173
送出感谢: 0 次
接收感谢: 0 次
恩,ee这招比较帅,抵得上万行代码。


_________________
Desire Freedom, Love Beauty, Keep Hacking。


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 怎么把文件名中的空格全去掉
帖子发表于 : 2010-01-08 13:48 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
openware 写道:
恩,ee这招比较帅,抵得上万行代码。


囧。。。我用ee的方法不行啊,是我没有领会到吗?你帮我讲讲撒~~多谢啦!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 18 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译