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

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

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

#31

帖子 erol » 2010-07-11 17:15

成品,m3u里带#的,除了第一行都可以不要,因为不知道怎么获得歌曲长度,就不加了
第一个参数为要处理的目录路径,第二个参数为保存m3u的目录路径

代码: 全选

#!/bin/bash
#***第一个参数为要处理的目录路径,第二个参数为保存m3u的目录路径***
if [ ! -d "$1" ];then
	echo "$1 is not a folder"
	exit 2
fi

if [ ! -d "$2" ];then
	echo "$2 is not a folder, now create it"
	mkdir -p "$2"
	if [ "$?" -ne 0 ];then
		echo "can't create $2"
		exit 3
	fi
fi

find "$1" -type f -name '*.mp3' | while read line
do
	line2=`dirname "$line"`
	nameofplaylist="$2"/playlist-`basename "$line2"`.m3u
	if [ ! -f "$nameofplaylist" ];then
		echo "#EXTM3U"> "$nameofplaylist"
	fi
	echo "$line">>"$nameofplaylist"
done

exit 0
另外,实在没有用遍历的必要
伊吹风子的邻居常说:那孩子是个普通的地球人
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

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

#32

帖子 ルルティア » 2010-07-11 17:17

哈哈,遍历成功,多谢大家鼎力相助! :em09

代码: 全选

#!/bin/sh
IFS='
'
dirscan()
{
ls -1 $1 | while read filename
do
   if [ -d "$filename" ]; then
      cd "$filename"
	temp=`pwd`
      dirscan "$temp"
      cd ..
   else
      echo $filename
   fi
done
}
cd $1
dirscan "$1"
unset IFS
接下来写生成列表的部分……
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

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

#33

帖子 ルルティア » 2010-07-11 17:19

:em20 被插楼了。。31楼的貌似有点复杂啊。。等会比较一下。。 :em11
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

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

#34

帖子 ルルティア » 2010-07-11 17:22

:em20 31楼签名。。。难道是慧慧的马甲?
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#35

帖子 aerofox » 2010-07-11 17:25

其实10楼JiangHui贴的脚本就差两处引号吧。

代码: 全选

#!/bin/sh
dirscan()
{
for filename in *; do
   if [ -d "$filename" ]; then
      cd $filename
      dirscan "$(pwd)/${filename}"         # 这里原来漏了引号,导致遍历不成功。$(pwd)/ 可省略。
      cd ..
   else
      echo "$filename"                     # 这里原来也漏了引号,但不会导致遍历问题。
   fi
done
}
cd $1
dirscan "$1"
JiangHui
论坛版主
帖子: 21308
注册时间: 2007-08-02 20:29
系统: 窓辺とうこ

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

#36

帖子 JiangHui » 2010-07-11 17:30

ルルティア 写了::em20 31楼签名。。。难道是慧慧的马甲?

我在29楼贴了一个脚本,怎么可能拿马甲再来贴一个 :em04
测试过了
2010-07-11-172946_726x337_scrot.png
姐控早说干嘛的不就完了吗,浪费一天时间
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

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

#37

帖子 ルルティア » 2010-07-11 18:14

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
######################
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

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

#38

帖子 ルルティア » 2010-07-11 18:35

对了,要是用慧慧那个还是得碰到sed问题,我要放在mp3里面,可能/和\还不一样。。
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
erol
帖子: 61
注册时间: 2010-05-16 23:17

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

#39

帖子 erol » 2010-07-11 19:10

ルルティア 写了::em20 被插楼了。。31楼的貌似有点复杂啊。。等会比较一下。。 :em11
就是用find把目录下的所有mp3文件找出来,然后放进对应的m3u文件,如果对应的m3u文件不存在则创建
伊吹风子的邻居常说:那孩子是个普通的地球人
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

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

#40

帖子 sevk » 2010-07-11 19:10

ruby实现:

代码: 全选

#!/usr/bin/env ruby
# coding: utf-8
# [email protected]

require 'find'
alias echo puts #添加一个echo方法 :)

def dirscan(dir=ARGV[0])
	Find.find(dir) do |f|
		if File.directory? f
			dirscan dir + f
		else
			echo f
		end
	end
end

if ARGV[0] 
	dirscan
else 
	puts "用法: dirscan.rb . "
end
上次由 sevk 在 2010-07-12 15:39,总共编辑 1 次。
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
ルルティア
帖子: 1077
注册时间: 2010-05-23 17:10

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

#41

帖子 ルルティア » 2010-07-11 20:52

好多方法啊,现在我纠结的是怎么把路径里面的"/"替换成"\",用sed的话
我这样写

代码: 全选

sed -r 's/\//\\/g'
但是运行时候会报错。。

代码: 全选

sed: -e expression #1, char 8: unterminated `s' command
everything is nada; nada is nothing
Otro Loco Más
我是Lavande的马甲,但是有时候,我觉得,我们不是同一个人。
头像
Destine
论坛版主
帖子: 568
注册时间: 2009-05-05 20:45

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

#42

帖子 Destine » 2010-07-11 21:02

树的遍历。。。嗯。。。深搜。
The world never lacks miracles.
JiangHui
论坛版主
帖子: 21308
注册时间: 2007-08-02 20:29
系统: 窓辺とうこ

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

#43

帖子 JiangHui » 2010-07-11 21:39

代码就不看了,要把 / 换成 \ 用vim就可以了

:%s/\//\\/g

vim可以批量操作多个文件
http://www.linuxsir.org/bbs/showthread.php?t=207886
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#44

帖子 aerofox » 2010-07-11 22:00

ルルティア 写了:好多方法啊,现在我纠结的是怎么把路径里面的"/"替换成"\",用sed的话
我这样写

代码: 全选

sed -r 's/\//\\/g'
但是运行时候会报错。。

代码: 全选

sed: -e expression #1, char 8: unterminated `s' command
这条命令我这运行很正常,
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#45

帖子 aerofox » 2010-07-11 22:20

ルルティア 写了: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 语句,实话说,我没看出你想干什么。
回复