Bash脚本根据部分文件名将文件存档到文件夹中

时间:2014-12-22 21:15:37

标签: linux bash shell

我找到了类似问题的示例,根据文件名将文件排序到文件夹中,但我真的不知道从哪里开始,因为我需要循环处理多个事情,并且可以提供一些帮助。

我有一个电话录音文件夹,文件名格式如下:

OUT260-20140828-125114-1409226674.42655.wav

它分为几个部分

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

其余的我不确定我认为它是id的一个王者,因为它每次都会增加。

我想要最终得到的是由cron job / bash脚本创建的以下文件夹结构

顶级

分机号码,例如

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

希望有任何帮助非常有意义

1 个答案:

答案 0 :(得分: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进行测试......