[英]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.