2017-10-19 322 views
0

我一直在想辦法重新命名嵌套文件夾中列出的文件名,並且遇到解決此問題的問題。作爲一個測試,我已經能夠削減我想要改變的名稱的哪一部分,但不能想到如何將它放入一個變量並將它們連接在一起。文件格式看起來像這樣。更改嵌套文件夾中文件的名稱

XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 

我一直在測試這種格式,以削減我想要改變的部分,但我不確定這將是做到這一點的最佳方式。

echo XXX_XXXX_YYYYYYYYYY_100426095135-all.mp3 | awk -F_'{print $ 4}'| cut -c 1-6

我想將名稱中的100426151653更改爲此20100426-151653格式。

我試圖用這個命令用這個格式的'//g'重命名文件,但是這種格式不起作用,我只好重新命名''''文件名來刪除空格。

因此該文件將開始爲這個 XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 和這樣結束 XXX_XXXX_YYYYYYYYYY_20100426-151653-all.mp3

+0

用四個空格前綴代碼/數據。請看[編輯幫助](http://stackoverflow.com/editing-help)。 – Cyrus

回答

0

如何使用查找和bash函數

#!/bin/bash 

modfn() { 
    suffix=$2 
    fn=$(basename $1) 
    path=$(dirname $1) 

    fld1=$(echo $fn | cut -d '_' -f1) 
    fld2=$(echo $fn | cut -d '_' -f2) 
    fld3=$(echo $fn | cut -d '_' -f3) 
    fld4=$(echo $fn | cut -d '_' -f4) 
    fld5=${fld4%$suffix} 
    l5=${#fld5} 
    fld6=${fld5:0:$(($l5 - 6))} 
    fld7=${fld5:$(($l5 - 6)):6} 

    newfn="${fld1}_${fld2}_${fld3}_20${fld6}-${fld7}${suffix}" 

    echo "moving ${path}/${fn} to ${path}/${newfn}" 
    mv ${path}/${fn} ${path}/${newfn}" 
} 


export -f modfn 

suffix="-all.mp3" 
export suffix 

find . -type f -name "*${suffix}" ! -name "*-*${suffix}" -exec bash -c 'modfn "$0" ${suffix}' {} + 

的上面的bash腳本使用find在當前文件夾中搜索,它的內容爲WWW_XXXX_YYYYYYYYYY_AAAAAABBBBBB-all.mp3還排除es已被重命名並且看起來像WWW_XXXX_YYYYYYYYYYY_20AAAAAA-BBBBBB-all.mp3

W,X,Y,A,B可以是除下劃線或破折號之外的任何字符。

所有找到的文件被重命名

注意:有方法,以縮小上述腳本,但這樣做使得操作不太明顯。

+0

我已經得到了程序運行,它的確如你所說的那樣。那麼有兩個問題。 1.它一次只能執行一個文件。其次是嵌套文件播放不好。你有什麼建議嗎? – dreedy

0

這Perl的一個班輪這項工作:

find . -name "XXX_XXXX_YYYYYYYYYY_*-all.mp3" -printf '%P\n' 2>/dev/null | perl -nle '$o=$_; s/_[0-9]{6}/_20100426-/; $n=$_; rename($o,$n)if!-e$n' 

注:我來只是一個find命令和正則表達式的一部分。 perl one liner的積分轉到perlmonks用戶http://www.perlmonks.org/?node=823355

+0

如果我正確地看到這一個襯墊,它看起來就像它只適用於那個名稱爲_20100426的文件。我不認爲這將適用於不同日期的嵌套文件。 – dreedy

相關問題