2016-07-03 175 views
4

我是一個總的小白,但我想出了這個腳本執行以下操作:bash腳本優化文件重命名

我有一個在那裏與未知的文件夾名稱裏面的RAR文件的子文件夾名爲「中的unrar」文件夾中。 現在我輸入unknownsubfolder,在unknownsubfolder中找到rar文件並unrar它。 之後,我找到了新文件,並用unknownsubfoldername將其重命名。現在我抓住該文件並將其移至./unrar。

#!/bin/bash 

cd /home/user/unrar/ 

for dir in /home/user/unrar/*; 
    do (cd "$dir" && find -name "*.rar" -execdir unrar e -r '{}' \;); done 

echo "$(tput setaf 2)-> unrar done!$(tput sgr0)" 

for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mkv" -exec mv '{}' "${PWD##*\/}.mkv" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mp4" -exec mv '{}' "${PWD##*\/}.mp4" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.avi" -exec mv '{}' "${PWD##*\/}.avi" \;); done 

cd /home/user/unrar 
find -name "*.mkv" -exec mv '{}' /home/user/unrar \; 
find -name "*.mp4" -exec mv '{}' /home/user/unrar \; 
find -name "*.avi" -exec mv '{}' /home/user/unrar \; 

這正常工作與大多數文件,但在某些情況下,它不會

我想找到* .rar程序在DIR和的unrar它。 (.mkv | .avi | .mp4)應重命名爲DIR(.mkv | .avi | .mp4)並移至./unrar

這是我的文件結構。

./unrar/ 
    - unknownsubfolder/ 
     -file.rar 
     -file.r00 
     -.... 
    - unknownsubfolder1/ 
     - s01/ 
      - file.rar 
      - file.r00 
      - .... 
     - s02/ 
      - file.rar 
      - file.r00 
      - .... 
     - .... 

如果case1,unrar「/unknownsubfolder/file.rar」並獲得「x.mkv」。該文件被從 「x.mkv」 到 「unknwonsubfolder.mkv」 重命名並移動到 「./unrar/unknownsubfolder.mkv」 (相同帶* .AVI + *的.mp4)== PERFEKT

如果情形2,在我的腳本unknownsubfolder/s01/file.rar將被unrard,但不會重命名爲s01.mkv insted unknwonsubfolder1.mkv。 (如果有更喜歡S02,S03,S04 ...)我一直在./unrar一個unknownsubfolder.mkv文件)==錯誤輸出

,所以我想結束了,我有3個問題

如何獲取重命名文件的正確DIRname?或者,我如何輸入unknownsubfolder/s01 ....?

有沒有辦法從查找中排除單詞?有時「unknownsubfolder」包含另一個名爲「sample(.mkv | .avi | .mp4)」的文件夾+文件。我想排除這一點,以防止原始文件被示例文件覆蓋。有時會發生。

我相信我可以結合一些代碼,使其更短。有人可以解釋一下嗎?所以我如何將mkv,avi和mp4整合到一行中。

問候,袋熊

(編輯:爲更好地理解)

+0

我是否正確理解,在有問題的情況下,您在unknownsubfolder中有30個子文件夾而不是一個rar文件?正如你所說的那樣,人們可能會認爲它只是一個名爲'subfolder1-30'的文件夾。那些子文件夾是否還包含一個單一的rar文件? – nautical

+0

右鍵,unknownsubfolder最多可包含30個子文件夾,每個子文件夾都包含rar中的壓縮視頻。 – wombat

回答

2

UPDATE:

我調整了解決方案與unrar工作。由於我之前沒有安裝unrar,我用gunzip來構建解決方案,然後簡單地用unrar替換它。這種方法的問題是,默認情況下,unrar提取到當前工作目錄。另一個區別是提取文件的名稱可能與存檔的名稱完全不同 - 它不僅僅是不同擴展名的問題。提取後,原始存檔也不會被刪除。

這裏是專門針對與unrar工作對於上述問題的解決方案:

#!/bin/bash 

path="$1" 
omit="$2" 

while read f;do 
     unrar e -r "${f}" "${f%/*}" > /dev/null 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -print) 

while read f;do 
     new="${f%/*}" 
     new="${new##*/}" 
     mv "${f}" "${path}/${new}" 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -a \! -name '*.rar' -print) 

您可以保存腳本,例如,爲rename-script(不要忘記使其可執行文件),然後調用它像

./rename-script /path/to/unrar omitfolder 

注意,該腳本里面有沒有cd。您至少必須提供unrar文件夾的位置作爲第一個參數,否則您將收到錯誤。在OP的情況下,這將是/home/user/unraromitfolder而不是一個路徑,它只是你想要省略的文件夾的名稱。所以在OP的情況下,這將是sample

./rename-script /home/user/unrar sample 

正如意見中的要求由OP,可以以瞭解閱讀有關bash read-builtinprocess substitution如何while -loop工作以及如何分配由find返回變量f文件名。

+0

非常感謝你的回答。現在我沒有想到一件事情,但我會試圖弄明白,什麼會做什麼,並帶來更好的反饋。 – wombat

+0

當我運行該腳本時,我在「done <<」意外的詞上出現語法錯誤。我可以讓almot弄清楚每一行在該腳本中的作用,但不是真正的「讀取f」的意思,然後是「$ {f}」。我想這是我想要unrar的文件,但f如何知道它是unrar的文件。你能解釋一下嗎? – wombat

+0

@wombat我更新了使用'unrar'的解決方案。我之前使用'gunzip',並簡單地用'unrar'替換它。但是,您的錯誤是由於未正確調用腳本而導致的。您至少必須提供unrar文件夾的位置作爲第一個參數。如果你的unrar文件夾總是在同一個位置,並且omit文件夾將始終具有相同的名稱,那麼你可以通過改變'path =「/ home/user/unrar」'和'omit = sample'將它們硬編碼到腳本中。然後你可以不帶參數地調用它。 – nautical