2014-12-22 116 views
1

我发现了类似问题的例子,它根据文件名将文件分类到文件夹中,但并不知道从哪里开始,因为我需要循环执行多个任务可以做一些帮助,请。Bash脚本根据部分文件名将文件归档到文件夹中

我有电话录音具有下列文件名格式的文件夹:

OUT260-20140828-125114-1409226674.42655.wav 

把它拆成几个部分

OUT260 = 260 is the name of the extension 
20140828 = the date 
125114 = the time 

其余林不知道,我认为这是一些王因为它每次增加。

我想落得什么是cron作业/ bash脚本

顶层创建以下文件夹stucture

分机号码,例如

260,261,262

那么年 然后月 然后日 然后多个文件,例如文件名称上面的260-1251.wav

所以如果可以做到这一点的例子文件最终会如下

/Recordings/260/2014/08/28/260-1251.wav 

我有以下的例子是一个比较简单的例子:

#!/bin/bash 

for full_filename in *jpg; do 
extension="${full_filename##*.}" 
filename="${full_filename%.*}" 
mkdir -p "$filename/picture" 
mv "$full_filename" "$filename/picture" 
done 

希望是有道理的任何帮助非常感谢

+0

这是否意味着一切以'OUT'开始? –

+0

该文件夹中可能还有其他文件,但是我正在使用的唯一文件是从OUT开始的。是 – Ross

回答

1

一个快速和肮脏的方式做到这一点是使用sed由路径替换名称:

#!/bin/bash 
for f in OUT*.jpg 
do 
    res=$(echo "$f" | sed -r 's#^OUT([0-9]+)\-([0-9]{4})([0-9]{2})([0-9]{2})\-([0-9]{4}).*\.(.*)$#/Recordings/\1/\2/\3/\4/\1-\5.\6#g') 
    mkdir -p `dirname "$res"` 
    mv "$f" "$res" 
done 

例如,如果$fOUT260-20140828-125114-1409226674.42655.wav$res/Recordings/260/2014/08/28/260-1251.wav。对于不符合正确模式的文件名,$res$f相同,因此没有任何反应。

sed利用正则表达式来查找和替换(部分)文件名。语法很难解释,但在互联网上有很多很好的教程。

此外请注意,这是在一般不是一个好主意,用一个根目录,比如`/ Recordings`` ...

请使用cp第一测试...

+0

非常感谢您的快速响应。它看起来好像它的工作,但它说:不能移动'OUT260-20140827-154225-1409150545.40620.wav'到'/home/Recordings/260/2014/08/27/260-1542.wav':没有这样的文件或目录 有没有办法创建目标文件夹,如果他们不存在在同一时间。 – Ross

+0

@Ross:我修改了程序,如果你添加了'mkdir -p'这一行,它就会起作用。Althoug评论道,也许你最好先用'cp'尝试一下,因为这可以防止数据丢失:s。 –

+0

非常棒这是完美的,非常感谢。我已经改变了单引号的后退标记,因为它认为是复制粘贴错误。 – Ross

相关问题