我是一个总菜鸟,但我想出了这个脚本做了以下事情:
我有一个名为“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-builtin和process substitution的内容,以了解while循环的工作原理以及它如何将find返回的文件名分配给变量f.