【已解决】遍历目录的脚本老写不好,急躁【写了一个魅族M3用的播放列表制作工具】

sh/bash/dash/ksh/zsh等Shell脚本
头像
erol
帖子: 61
注册时间: 2010-05-16 23:17

Re: 遍历目录的脚本老写不好,急躁。。

#46

帖子 erol » 2010-07-11 23:23

aerofox 写了:
ルルティア 写了:aerofox, 我试了,不知道怎么回事,竟然出现死循环了。。 :em20
慧慧那个看起来不错,待会儿我试一下,大家先帮我看看我这个哪里出问题了啊,主要是生成列表那里,还有那个sed替换。。遍历没问题,已经测试过了

代码: 全选

#!/bin/sh
IFS='
'
dirscan()
{
ls -1 $1 | while read filename
do
   if [ -d "$filename" ]; then
      cd "$filename"
#	temp=`pwd`
#      dirscan "$temp"
      dirscan `pwd`
      cd ..
   else
	path=`pwd | sed 's/'/'/'\'/'`
      echo "#EXTM3U\n#EXTINF:0,${filename}\n${path}\\${filename}" >> ${savepath}/`$(pwd).m3u`
   fi
done
}
savepath=`pwd`
cd $1
dirscan "$1"
unset IFS

######################
#	列表样本
#	#EXTM3U
#	#EXTINF:0,05.With An Orchid.mp3
#	\Users\acer\Music\Music\melody\Yanni\05.With An Orchid.mp3
######################
遍历应该会遇到问题的。

代码: 全选

ls -1 $1 | while read filename
$1没加引号,如果第一个参数是 "a sub dir",问题就来了。如果是 "* important" 这样的变态名字,问题就更大了。
那条 sed 语句,实话说,我没看出你想干什么。
那条语句应该是想让m3u文件中的音乐文件路径中的"/"都变成"\",如果还用的是相对路径的话,就有完全的通用性,不管是linux还是windows都能用
比如的列表样本中 \Users\acer\Music\Music\melody\Yanni\05.With An Orchid.mp3
但很显然这里没使用相对路径
上次由 erol 在 2010-07-11 23:32,总共编辑 1 次。
伊吹风子的邻居常说:那孩子是个普通的地球人
mrac
帖子: 1
注册时间: 2010-07-11 23:20

Re: 遍历目录的脚本老写不好,急躁。。

#47

帖子 mrac » 2010-07-11 23:27

看起来好像是蛮低级的错误。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 遍历目录的脚本老写不好,急躁。。

#48

帖子 aerofox » 2010-07-12 6:26

经楼上的楼上一提,再仔细看看楼主的那条 sed 语句,才想通他为何那么用了,看来是对引号的作用有点不明白。
sed的问题已经有人给解决了,就不再多说了。
如果用 bash(第一行改为 #!/bin/bash),则不用 sed 也可以完成替换:

代码: 全选

path="${PWD//\//\\}"
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

Re: 遍历目录的脚本老写不好,急躁。。

#49

帖子 ルルティア » 2010-07-12 10:28

代码: 全选

	path=`pwd | sed -r 's/\//\\/g'`
这个我运行会出错。。

代码: 全选

sed: -e expression #1, char 8: unterminated `s' command
但是如果单独运行

代码: 全选

pwd | sed -r 's/\//\\/g'
就一点问题也没有
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

Re: 遍历目录的脚本老写不好,急躁。。

#50

帖子 ルルティア » 2010-07-12 10:39

aerofox, 那个的确有效 :em11 我再改改,貌似保存文件那里问题很大。。
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 遍历目录的脚本老写不好,急躁。。

#51

帖子 aerofox » 2010-07-12 12:39

代码: 全选

path=`pwd | sed -r 's/\//\\/g'`
改成:

代码: 全选

path=`pwd | sed -r 's/\//\\\\/g'`
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

Re: 遍历目录的脚本老写不好,急躁。。

#52

帖子 ルルティア » 2010-07-12 14:42

多谢大家!已经完成了,我最后测试一下,好了马上贴上来 :em11
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

Re: 【已解决】遍历目录的脚本老写不好,急躁【写了一个魅族M3用的播放列表制作工具】

#53

帖子 ルルティア » 2010-07-12 14:51

测试没问题,更新在1楼了 :em09 :em11
多谢童鞋们的帮忙,真不容易啊。。写的我饿死了。。。睡觉去
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
erol
帖子: 61
注册时间: 2010-05-16 23:17

Re: 【已解决】遍历目录的脚本老写不好,急躁【写了一个魅族M3用的播放列表制作工具】

#54

帖子 erol » 2010-07-17 22:28

加入将歌曲的路径变为相对路径的功能如何,这样移动之后也能用
比如:
m3u的保存目录 /home/a/audio/b/playlist
mp3的路径 /home/a/audio/happytreefriend/op.mp3

m3u中的mp3的相对路径就是 ../../happytreefriend/op.mp3

有没有现成的解决方法

echo ${a#$b}解决不了这个问题
伊吹风子的邻居常说:那孩子是个普通的地球人
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 【已解决】遍历目录的脚本老写不好,急躁【写了一个魅族M3用的播放列表制作工具】

#55

帖子 aerofox » 2010-07-17 22:35

erol 写了:加入将歌曲的路径变为相对路径的功能如何,这样移动之后也能用
比如:
m3u的保存目录 /home/a/audio/b/playlist
mp3的路径 /home/a/audio/happytreefriend/op.mp3

m3u中的mp3的相对路径就是 ../../happytreefriend/op.mp3

有没有现成的解决方法

echo ${a#$b}解决不了这个问题
最简单的就是:

代码: 全选

cd /home/a/audio/b/playlist
find ../../happytreefriend -name '*.mp3'
# 或者如果不需要 happytreefriend 目录下的子目录,则
ls ./../happytreefriend/*.mp3
头像
erol
帖子: 61
注册时间: 2010-05-16 23:17

Re: 【已解决】遍历目录的脚本老写不好,急躁【写了一个魅族M3用的播放列表制作工具】

#56

帖子 erol » 2010-07-18 2:07

aerofox 写了:
erol 写了:加入将歌曲的路径变为相对路径的功能如何,这样移动之后也能用
比如:
m3u的保存目录 /home/a/audio/b/playlist
mp3的路径 /home/a/audio/happytreefriend/op.mp3

m3u中的mp3的相对路径就是 ../../happytreefriend/op.mp3

有没有现成的解决方法

echo ${a#$b}解决不了这个问题
最简单的就是:

代码: 全选

cd /home/a/audio/b/playlist
find ../../happytreefriend -name '*.mp3'
# 或者如果不需要 happytreefriend 目录下的子目录,则
ls ./../happytreefriend/*.mp3
您误会了... :em06 我想要的是绝对路径a对于绝对路径b的相对路径,不是按照相对路径进行搜索
比如调用1楼脚本时参数1是 /home/a/audio/happytreefriend/
当前路径是 /home/a/audio/b/c/e/f/playlist
要自动给出参数1a对于当前路径的相对路径
伊吹风子的邻居常说:那孩子是个普通的地球人
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

Re: 【已解决】遍历目录的脚本老写不好,急躁【写了一个魅族M3用的播放列表制作工具】

#57

帖子 ルルティア » 2010-07-18 10:04

不是吧,要移动之后也能用,当然是要绝对路径
用相对路径的话,m3u和mp3相对位置一改变就不能用了啊
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
回复