簡體   English   中英

bash腳本優化文件重命名

[英]bash script optimization file rename

我是一個總菜鳥,但我想出了這個腳本做了以下事情:

我有一個名為“unrar”的文件夾,其子文件夾中包含未知的foldername,里面有rar文件。 現在我輸入unknownsubfolder,找到rar文件並在unknownsubfolder中取消它。 之后我找到新文件並用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 \;

這適用於大多數文件,但在某些情況下它沒有

我想在DIR和unrar中找到* .rar。 newfile。(。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

如果是case2,在我的腳本unknownsubfolder / s01 / file.rar中會被取消,但是沒有重命名為s01.mkv insted到unknwonsubfolder1.mkv。 (如果有更多像s02,s03,s04 ......)我總是在./unrar中找到一個unknownsubfolder.mkv文件==錯誤的輸出

所以我想我有3個問題

如何獲得重命名文件的正確DIR名稱? 或者我如何輸入unknownsubfolder / s01 ....?

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

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

問候,袋熊

(編輯:為了更好地理解)

更新:

我調整了解決方案以使用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/unrar omitfolder 不是一個路徑,它是要忽略的文件夾的只是名字。 所以在OP的情況下,這將是sample

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

根據OP在評論中的要求,您可以閱讀bash read-builtin進程替換 ,以了解while -loop如何工作以及如何將find返回的文件名分配給變量f

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM