2013-06-13 157 views
0

我有一個大型的媒體文件存儲庫,它遵循Torrent命名約定 - 令人不快的閱讀內容。有一次,我已經正確地命名了包含所述文件的文件夾,但不想將所有.avi,.mkv等文件轉儲到我的主要媒體目錄中,使用bash腳本。將文件夾內的文件重命名爲文件夾名稱,同時保留擴展名

概述: 當前目錄樹:

Proper Movie Title/ 
->Proper.Movie.Title.2013.avi 
->Proper.Movie.Title.2013.srt 
Title 2/ 
->Title2[proper].mkv 
Movie- Epilogue/ 
->MOVIE EPILOGUE .AVI 
Media Movie/ 
->MEDIAMOVIE.CD1.mkv 
->MEDIAMOVIE.CD2.mkv 

。 。 。

所需的目錄樹:

Proper Movie Title/ 
->Proper Movie Title.avi 
->Proper Movie Title.srt 
Title 2.mkv 
Movie- Epilogue.avi 
Media Movie/ 
->Media Movie.cd1.mkv 
->Media Movie.cd2.mkv 

雖然這將是一個理想,我的主要願望是與僅在單個電影文件的目錄有該文件被重命名,移動到父目錄。

我目前的做法是在.sh文件中使用double for循環,但是我現在很難在頭腦中保留新的bash知識。

幫助,將不勝感激。

我當前的代碼(只是爲了獲得進入內部電影文件):

#!/bin/bash 
FILES=./* 
for f in $FILES 
do 
     if [[ -d $f ]]; then 
       INFILES=$f/* 
       for file in $INFILES 
       do 
         echo "Processing >$file< folder..." 
       done 
     #cat $f 
     fi 
done 
+1

快速解決方案是對盜版說不!購買電影,他們將有適當的標題。 –

+0

顯示你已經嘗試過的,我們不是在這裏爲你寫你的代碼。 – Barmar

+0

添加了我正在思考的代碼。 – SWPhantom

回答

3

這裏的東西很簡單:

find * -type f -maxdepth 1 | while read file 
do 
    dirname="$(dirname "$file")" 
    new_name="${dirname##*/}" 
    file_ext=${file##*.} 
    if [ -n "$file_ext" -a -n "$dirname" -a -n "$new_name" ] 
    then 
     echo "mv '$file' '$dirname/$new_name.$file_ext'" 
    fi 
done 

find *說運行找到所有項目在當前目錄。 -type f表示您只對文件感興趣,而-maxdepth 1將搜索深度限制爲直接目錄。

  • ${file##*.}使用圖案匹配。 ##表示最大的左手匹配*.,這基本上將所有內容都拉到文件擴展名。
  • file_dir="$(dirname "$file")"獲取目錄名稱。
  • 注意無處不在!你必須小心空格。

順便說一句,我echo而不是做實際的舉動。我可以將輸出傳遞給一個文件,檢查該文件並確保一切看起來都正常,然後將該文件作爲shell腳本運行。

+0

這太好了,大衛。非常感謝。 是否有確定的方法來檢測目錄中有多少文件? 「| wc」命令似乎不返回文件數量,而是返回目錄內的單詞數量。 我想有一個條件,只有在目錄中有<= 2個文件時才執行給定的代碼。 – SWPhantom

+0

@SWPhantom命令'wc -l'將返回_lines_,而不是單詞。見所有各種選項的'man wc'。 –

相關問題