bash脚本优化文件重命名

时间:2016-07-03 10:27:28

标签: bash unrar

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

我有一个名为“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。新文件。(。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
            - ....
        - ....

if 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合并为一行。

问候,袋熊

(编辑:为了更好地理解)

1 个答案:

答案 0 :(得分:2)

<强>更新

我调整了解决方案以使用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 - 循环的工作原理以及它如何分配{返回的文件名{1}}变量find