2017-05-28 74 views
1

所以我是一個編碼新手,並且有一段時間想要編輯我相當廣泛的現場音樂庫的格式。我在這裏和各種其他資源環顧四周,看看我在哪裏,但我遇到了困難。我有以下方式命名的目錄:將文件/目錄從一種日期格式重命名爲另一種

  • 02.10.90 | 23 East Caberet - 賓夕法尼亞州阿德莫爾
  • 02.16.90 |天堂 - 馬薩諸塞州波士頓

,我想這些重命名只是爲了

  • 1990年2月10日| 23 East Caberet - 賓夕法尼亞州阿德莫爾
  • 1990-02-16 |天堂 - 馬薩諸塞州波士頓

我已經能夠正確地命名日期使用:

ls -1 | grep 90 | awk '{print $1}' | awk -F. '{printf "%s-%s-%s\n", "19"$3,$1,$2}' > list1.txt 

,然後使用

ls -1 | grep 90 | awk '{first = $1; $1 = ""; print $0}'>list2.txt 

所以,我拉姓名的其餘部分從1990年到2004年的目錄列表,我希望將它應用到(它們都在不同的子目錄中,所以我不介意手動更改「grep 90」)。但是,從我生成的兩個單獨列表,我無法弄清楚如何讓它循環通過每一行和打印「MV ORIGINAL_NAME list1.txt + list2.txt」,因此,它會讀取:

mv 02.10.90 | 23 East Caberet - Ardmore, PA 1990-02-10 | 23 East Caberet - Ardmore, PA 

我經歷了許多以前的帖子掃描,不能完全弄清楚的最後一位 - 或者更好的是,更優雅的解決方案!任何幫助非常感謝,提前謝謝!

回答

0

不要從ls解析輸出,谷歌爲什麼,而且當你使用awk時你不需要grep,也不需要awk命令鏈,但是對於這個任務你不會使用任何那些無論如何命令。

查找文件的UNIX命令被命名爲find,所以從此開始。這將找到名稱以給定匹配模式開頭的所有目錄:

find . -type d -name '[0-9][0-9].[0-9][0-9].90 *' 

現在您已經找到了需要對它們執行某些操作的文件。爲了您的需求恕我直言,最簡單的方法是最好的,而且會是:

find . -type d -name '[0-9][0-9].[0-9][0-9].90 *' -print0 | 
while IFS= read -r -d '' old; do 
    path="$(dirname "$old")" 
    oldDirName="$(basename "$old")" 
    if [[ oldDirName =~ ([0-9]+)\.([0-9]+)\.([0-9]+)(.*) ]]; then 
     newDirName="19${BASH_REMATCH[3]}-${BASH_REMATCH[1]}-${BASH_REMATCH[2]}${BASH_REMATCH[4]} 
     echo mv -- "${path}/${oldDirName}" "${path}/${newDirName}" 
    fi 
done 

以上用的是GNU找到-print0和bash的BASH_REMATCH。如果有必要調試它,請刪除echo,並對將要執行的操作感到滿意。

+0

非常感謝您的幫助!這提供了我的問題很多見解 - 我沒有提到的一件事是,我正在運行Mac OS Sierra,並不認爲GNU命令將在我的bash中工作。我會試着弄清楚它是否能讓它工作。 – PGruven

+0

您可以在Mac上安裝GNU工具。去谷歌上查詢。否則,如果您的文件名不包含換行符,而不是從find和'-d'''從讀取中刪除'-print0',其餘部分將按原樣運行。 –

相關問題