2013-03-11 90 views
0

我有一个有趣的问题,我希望可以通过shell命令轻松解决。我有一个目录树,其中的目录名是有意义的,每个目录内有几个文件,包括一个.mp3文件。重命名文件以匹配目录名称

我想批量重命名所有的mp3文件以匹配目录的名称。

例如高级别的目录看起来是这样的:

Seans-iMac% ls 
2006.James Lovelock: Gaia’s Revenge 
2006.Religion and stem cell research 
2006.Stephen Schneider 
2006.Tony Judt: Post-war Europe since 1945 
2006.Water management 
2007.'Here, Bullet' 
2007.Alan Bennett 

每个子目录的内容是相似的,如:

Seans-iMac% cd "2006.Religion and stem cell research" 
Seans-iMac% ls 
details.txt  lnl_20060605.mp3 synopsis.txt 

我想将它改成这样:

Seans-iMac% ls 
details.txt  2006.Religion and stem cell research.mp3 synopsis.txt 

我试过循环但似乎无法获得参数正确。为了使它更复杂,目录名称有空格,并且有些单引号。

+0

请更新您的代码到目前为止的问题 – 2013-03-11 13:50:12

回答

3

如果确定有在每个子目录最多一个MP3文件,这应该这样做:

for i in *; do mv "$i"/*.mp3 "$i/$i.mp3"; done 

注意双引号,即处理空间。

+0

完美 - 它也提交了单引号。 – ardochhigh 2013-03-11 15:55:46

2
for d in 2???.* 
do 
    mv "$d"/*.mp3 "$d/$d.mp3" 
done 

glob模式会生成您感兴趣的目录名称,保留名称中的空格。 mv命令假定子目录中只有一个.mp3文件,因此第一个参数将展开为正确的文件名(空格将再次保留),第二个参数具有所需的格式。请注意,*.mp3位于双引号字符串之外;这允许文件名称扩展。请注意,目录名称(可能包含空格)始终位于双引号内,以避免丢失空格。

请谨慎使用除glob以外的机制来生成目录名称。这并不是说他们不能使用;只需要小心。请注意,包含换行符的目录名称比空格更容易出现问题;我会重命名这些目录,以便它们不包含换行符(对于包含换行符的文件名同样适用)。名字中的首尾空白也可能存在问题。

+0

谢谢乔纳森给出了非常明确的答案。我给了他,因为他有相同的答案,他的堆栈溢出评分远低于你的。我很感谢你的详细解释。 Sean – ardochhigh 2013-03-11 15:57:21

2

我的印象是你使用tcsh作为shell。 因为我不是一个大的专家,下面的代码会生成一个bash shell并使用bash语法。

bash -c 'find /path/to/root/dir -name \*.mp3 | while read file; do d=`dirname "$file"`; b=`basename "$d"`; echo mv -v "$file" "$d/$b.mp3";done' 

这不会做任何修改,它只是回应将被执行的命令。如果在重复检查后确实按照您的要求进行操作,请在mv命令前删除echo

这与上面的限制相同,如果目录中有多个mp3文件,最后(按字母顺序排列)的文件将具有directory.mp3的名称,并且所有其他mp3文件将被覆盖(读:失去)。

这种情况的不同之处在于文件夹的结构可以嵌套而不一定在一个层次上。

+0

关于'csh'的有趣观察 - 基于提示中的'%',毫无疑问。我不会花费更多的时间在关于['csh'编程被认为是有害的]的常见问题解答(http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)上。大多数人不使用C Shell进行严格的shell编程。 – 2013-03-11 15:35:49

+0

我正在使用zsh。该机器是一个新的版本,我刚刚安装了默认设置。 – ardochhigh 2013-03-11 15:52:57

相关问题