我是一个总菜鸟,但我想出了这个脚本来做以下事情:
我有一个名为“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合并为一行。
问候,袋熊
(编辑:为了更好地理解)
答案 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/unrar
。 omitfolder
不是路径,它只是您要忽略的文件夹的名称。因此,在OP的情况下,这将是sample
。
./rename-script /home/user/unrar sample
根据评论中OP的要求,您可以阅读有关bash read-builtin和process substitution的信息,以了解while
- 循环的工作原理以及它如何分配{返回的文件名{1}}变量find
。