Tag Archives: bash
查找重复文件
算是介绍一个奇淫巧技吧。查找重复的文件,这个应该有很多软件都可以做的。不过在Linux里面,利用系统工具,一句语句查找应该就比较少见了。
$find . -name "*" -type f -size +0 -exec md5sum {} \; | sort | uniq -d -w 32
原理是这样的,先用find查找当前所有文件。我们加上限定类型必须是文件,目录不要。限定大小不为0,空文件不要。然后对所有满足条件的执行md5sum,获得md5和文件的列表。然后排序,再针对md5的部分做唯一限定。就得到了所有md5相同的文件的列表。
问题是,这时候我们得到的还只是一堆重复的文件的md5。我们可以把以上步骤拆开来获得完整的输出。
$find . -name "*" -type f -size +0 -exec md5sum {} \; | sort > file_md5
$cat file_md5 | uniq -d -w 32
$grep "…" file_md5
相信大家都看出是怎么回事情了,就不赘言了。
Windows下以前我总是执行不出,原因在于要这么写。
>find . -type f -size +0 -exec md5sum {} ; | sort > report.txt
差一个转义,因为不需要。
总结一下,我们可以用一个脚本来处理这些问题。
————————–fine_rep——————————
find $1 -type f -size +0 -exec md5sum {} \; | sort > "file_md5"
cat "file_md5" | uniq -d -w 32 | cut -d" " -f1 | while read x
do
grep "$x" file_md5
echo ""
done
echo "done"
rm "file_md5"
————————————————————
X system 配置文件执行流程分析
1.startx启动流程
/usr/bin/startx +->/etc/X11/xinit/xinitrc ->/etc/X11/Xsession
|->~/.xinitrc
|->/etc/X11/xinit/xserverrc ->/usr/bin/X11/X
\->~/.xserverrc
startx脚本会分析用户主目录下是否存在特殊配置文件,如果不存在则使用系统默认脚本。默认脚本分两个部份,xinitrc启动客户端部份,xserverrc启动服务器端部份。
xserverrc内容仅为启动X。xinitrc会执行/etc/X11/Xsession,而后进入session分析。
2.Xsession
/etc/X11/Xsession ->/etc/X11/Xsession.d/*
/etc/X11/Xsession和/etc/init.d/rc很类似,是用来循环依次启动其他脚本的控制脚本。他负责启动/etc/X11/Xsession.d/下的所有文件。其中50xfree86-common_determine-startup文件会依次检测以下3个文件,并且设置到STARTUP变量中。x-session-manager;x-window-manager;x-terminal-emulator;最后99xfree86-common_start文件会执行exec $STARTUP;完成整个系统的启动过程。
3.gdm
gdm服务被/etc/init.d/gdm启动,而后读取/etc/gdm/gdm.conf配置自身。后面是基于理论分析,没有加以验证。
|-gdm—gdm-+-Xorg
| `-x-session-manag-+-scim
| `-ssh-agent
上面是pstree的结果,第1个gdm是/etc/init.d/gdm,第2个gdm是/usr/bin/gdm。gdm先启动一个X作为服务端,否则自身也无法以图形方式显示登录界面。而后gdm成为此X界面的唯一用户,显示登录系统。在用户登录后,gdm启动/etc/gdm/Xsession。这个脚本的内容和/etc/X11/Xsession非常类似,我怀疑为什么他们不用链接的方式(可能是因为包的关系?)。这时整个启动活动就结束了。
Linux配置文件测序
CopyRight:
Written by Shell.E.Xu. Published under GPL.
KeyWord:
Linux bash profile 配置文件。
Abstract:
利用变量声明次序测定多个配置文件是否被调用以及调用的次序。
环境:
Debian/GNU Linux starg 3.1
Kernel:2.6.16-686-2
测定方法,加入变量TEST=XXX。此方法可能被某些变量解除函数解除,因此不予执行的反应未必是真,不过执行次序一般假不了。
1.tty登录时
/etc/environment;/etc/profile;~/.bash_profile->~/.bashrc->/etc/bashrc;
/etc/environment;/etc/profile;~/.bash_login
/etc/environment;/etc/profile;~/.profile
当上级启动过程中文件不存在时,才进行下面的过程。
2.GDM登录时
/etc/environment
3.新启动bash时
/etc/bash.bashrc;~/.bashrc->/etc/bashrc;
4.~/.inputrc
根据文档,这个函数在readline函数初始化时启用。
5.结论
如果需要有效执行命令,需要同时修改/etc/profile和/etc/bash.bashrc。因为GDM登录的时候不执行登录脚本顺序,所以仅仅修改/etc/profile会造成对GUI下面开的term无效。虽然/etc/bashrc在理论上也有效,但是一旦~/.bashrc中没有引用,则无效(例如Debian中的root,由于安装系统的时候没有copy skel,所以缺少很多.XX文件)。如果仅仅是设定变量,可以用/etc/environment。该文件没有找到资料,其中仅可以设定变量(不用export,应当是被某程序作为配置读取而非脚本执行),据分析是登录时当即起效。
音乐文件转换技巧和脚本
好久没动手写啥东西了,最近在准备LPIC1考试。Will everyone keep finger cross 4 me?嘿嘿——
这个题目是个大家伙,反正每天写一点,也不忙在一时。大家有啥需要了解的,也可以问在下面。我会更新的。
copyright:
本文所提到各种软件版权归各个软件开发者所有。文章内容及所有附属脚本为独创,按照GPL发布。
keyword:
音乐 格式 转换 脚本 标签 bash shell script mp3 midi ape flac cue toc
directory:
1.文件格式解说
1.1.mp3/ogg
1.2.midi
1.3.ape
1.4.flac
1.5.cue/toc
1.6.wav
1.7.iso
2.文件转换
2.1.wav/mp3
2.2.wav/ape
2.3.wav/flac
2.4.midi2wav
2.5.iso/wav
3.转换细节问题
3.1.按照cue切割
content:
1.1.mp3/ogg
这两个是非常有名的音乐压缩文件,其中MP3是mepg II layer 3。不要以为是mpeg III。一般来说,MP3都被认为是一种小巧但是音质比较差的格式。不过事实上,要指摘MP3的音质前,你先自己找找是否满足了一定条件。周围是否安静,没有噪音。音源是否高清晰(拿MP3还原出来的CD是没意义的)。声音设备是否足够好(至少也要是高质量的音响或者高档耳机,耳塞或者200-300的所谓音箱根本不用说)。如果没有上述条件,那么MP3的音质也算过的去的。MP3格式的压缩比值大约是10:1,和wav相比。另外,如果有CD的话,最好使用lame进行适当压缩。而不要为了方便随便使用一个压缩工具。压缩最好使用VBR格式。这种格式本质上没有什么变化,只是在信息流高的地方使用高的编码格式,以获得最高的质量/空间比值。ogg具体情况没有研究,不过使用上和MP3没有区别。
1.2.midi
midi是所有格式中唯一不记录音频数据的音乐格式。midi记录的实质上是发声事件,简单来说就是什么时候鼓响了一下,什么时候钢琴的哪个键被按下了。因此midi也是没有立体声效果的。除非你使用特殊的软件指定某个乐器演奏时候的位置,然后根据环境生成出相应的音乐文件。midi文件在当前主要是两个用途。一个是midi记录了乐手演奏时候的指法细节,也记录了曲子的曲谱。midi本质上就是谱子。另外一个是midi的超小体积使得在某些嵌入系统(例如手机)上面可以作为背景音乐。
1.3.ape
ape是一种无损压缩格式,你可以把ape看成是一种只能对wav作用的zip文件。压缩比一般是2:1。
1.4.flac
flac和ape基本差不多。
1.5.cue/toc
cue/toc不是音乐文件,他们是用于flac/ape等光盘的音轨定义。一个CD可以有多个音轨,iso会记录下音轨的切分方式。但是ape就不行了。于是eac等抓轨软件生成cue来切分音乐文件。往往看到ape的发行方式是一个ape和一个cue,直接打开ape往往是一首非常长的歌曲。其实切分信息在cue里面。虚拟光驱使用的bin文件也是一样,会有配套的cue文件。两者可以用cuetools和mkcue互相转换。
1.6.wav
wav文件又叫做PCM编码格式。这是一切音乐的基础。无论你是哪种格式,最后都会被还原成wav的某种格式或者变形,才能够从声卡中播放出去。当然,midi的情况特殊,不在此列。
1.7.iso
iso也不是音乐文件,但是和音乐的关系非常密切。大家都知道iso是光盘的镜像,其实说的还不确切。iso本身就是光盘内容严格1字节比1字节复制的结果。至于有的为什么有其他格式。那就涉及光驱设备工作和数据流/加解密的问题了。
另外说一个iso的问题,大家知道linux下面挂载iso的指令是
#mount -t iso9660 -o loop file /mnt
这其实是两个步骤,一个是
#losetup /dev/loop0 file
这是用来将文件虚拟成为设备。另外一个是
#mount -t iso9660 /dev/loop0 /mnt
这才是真的挂载指令。如果我们需要读取设备文件,当然是去读取/dev/loop0(或者其他loop设备)。
2.1.wav/mp3
格式转换的基础是wav,只要你转换的过去,任何格式可以通过wav进行无损转换。但是在转换到/从wav的时候是有损失的,因此转换次数越少越好。其中mp3和wav的转换是最简单基础的,但是也是最复杂的。因为lame为了优化音质,有非常多的选项。在这里就不逐渐讲述了。不过最简单的你可以用选项-h直接转换,而用–decode反向转换(除非需要转换到其他格式,否则是没有意义的,这样转换出来的wav不会比原来的mp3更清晰!严格定义来说,他们是同等清晰的,wav没有遗失任何信息)。
lame可以在这里找到:http://lame.sourceforge.net/
2.2.wav/ape
ape的转换需要使用mac,参数非常简单。 Compress (high): ‘-c3000′ Decompress: ‘-d’。有其他选项,不过注意压缩选项不关系到清晰度,只和大小有关。
mac可以在这里下载。http://supermmx.org/linux/mac/
这里也可以,http://sourceforge.net/projects/mac-port/
注意有两个部分,mac port是真正的转换程序,xmms-mac只是xmms的调用插件,动态的转换ape文件到wav用来播放(我上面说过的~)。
2.3.wav/flac
和上面一样,To encode:
flac [-#] [INPUTFILE [...]]
-# is -0 (fastest compression) to -8 (highest compression); -5 is the default
To decode:
flac -d [INPUTFILE [...]]
To test:
flac -t [INPUTFILE [...]]
flac在debian里面已经附带了,大家开aptitude找找就有了。
2.4.midi2wav
2.5.iso/wav
是不是看不明白了?其实就是抓轨和刻录啦。抓轨的话,windows下面推荐eac,不过记得要有管理员帐户才可以用哦。这东西直接操作设备的。linux下面用cdparanoia好了,据说不错。刻录的话——看大家喜欢了
3.1.按照cue切割
其实这才是我写这个文档的核心意义,使用cue来切割音乐文件。一个大音乐文件当然不爽,所以我们要拿来切割一下。具体来说有两个切割方法,cue切割wav系列文件,cue切割mp3系列文件。
cue切割wav系列文件需要借助两个包,cuetools和shntool。
$cuebreakpoints disc.cue | shnsplit disc.wav
这个方法可以用来切割很多文件,未必是wav而已。根据shntool的说明,只要支持的格式,加个插件全可以切割。只是切割出来的文件会被很傻的命名成split-trackXXX.wav。需要根据cue再次重命名。如果你高兴,可以写一个脚本干这个事情,不过毕竟很傻。
而cue切割mp3系列文件则方便很多,只需要mp3splt一个包。
$mp3splt -ac cue mp3
最后各个按照音轨描述命名好的mp3就会自动生成,并且会自动生成mp3tag。这是我推荐的使用方法。
最后附上我写的脚本,可以自动识别ape或者flac文件,自动转换成mp3。并且判断是否有cue文件,存在的话自动给予切割。你可以放置在/usr/local/bin下面。
——————————mkmp3————————
#!/bin/bash
function test_and_mkmp3(){
if [ -f "$1.ape&quo
t; ]; then
mac "$1.ape" "$1" -d
rm "$1.ape"
elif [ -f "$1.flac" ]; then
flac -d "$1.flac" -o "$1"
rm "$1.flac"
fi
lame -h "$1"
rm "$1"
}
test_and_mkmp3 $@
if [ -f "$1.cue" -o -n "$2" ]; then
if [ -f "$1.cue" ]; then
cuefile="$1.cue"
else
cuefile="$2"
fi
mkdir "$1"
mv "$1.mp3" "$1/"
mv "$cuefile" "$1/"
cd "$1"
mp3splt -ac "$cuefile" "$1.mp3"
rm "$1.mp3"
rm "$cuefile"
cd ..
fi
exit 0
——————————————————————