bash脚本优化文件重命名

我是一个总菜鸟,但我想出了这个脚本做了以下事情:

我有一个名为“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 /path/to/unrar omitfolder

请注意,脚本内部没有cd.您必须至少提供unrar文件夹的位置作为第一个参数,否则您将收到错误.在OP的情况下,这将是/ home / user / unrar.省略文件夹不是路径,它只是您要省略的文件夹的名称.所以在OP的情况下,这将是样本.

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

根据OP在评论中的要求,您可以阅读有关bash read-builtinprocess substitution的内容,以了解while循环的工作原理以及它如何将find返回的文件名分配给变量f.

点赞