4

我是个菜鸟,但我想出了这个脚本来执行以下操作:

我有一个名为“unrar”的文件夹,里面有未知文件夹名称的子文件夹,里面有 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 中找到 *.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,解压“/unknownsubfolder/file.rar”,得到“x.mkv”。该文件从“x.mkv”重命名为“unknwonsubfolder.mkv”并移至“./unrar/unknownsubfolder.mkv”(与*.avi + *.mp4 相同)==perfekt

如果是 case2,在我的脚本中 unknownsubfolder/s01/file.rar 将是 unrard,但不会重命名为 s01.mkv 插入到 unknwonsubfolder1.mkv。(如果有更多类似 s02、s03、s04 ...)我总是在 ./unrar 中得到一个 unknownsubfolder.mkv 文件)==错误的输出

所以我想我有 3 个问题

我如何获得正确的 DIRname 来重命名文件?或者我如何输入 unknownsubfolder/s01 ....?

有没有办法从查找中排除一个词?有时“未知子文件夹”包含另一个名为“sample(.mkv|.avi|.mp4)”的文件夹+文件。我想排除它,以防止原始文件被示例文件覆盖。有时会发生。

我相信我可以结合一些代码,使其更短。有人可以解释一下吗?那么我如何将 mkv、avi 和 mp4 组合在一行中。

问候,袋熊

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

4

1 回答 1

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/unrar. 这omitfolder不是路径,它只是您要省略的文件夹的名称所以在 OP 的情况下,这将是sample.

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

根据 OP 在评论中的要求,您可以阅读有关bash read-builtin进程替换的信息,以了解while-loop 的工作原理以及它如何将返回的文件名分配给findvariable f

于 2016-07-03T12:44:52.710 回答