2014-12-22 167 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

相關問題