0

我有一个遵循 torrent 命名约定的大型媒体文件存储库——读起来不愉快。有一次,我已经正确命名了包含上述文件的文件夹,但不想使用 bash 脚本将所有 .avi、.mkv 等文件转储到我的主媒体目录中。

概述:当前目录树:

Proper Movie Title/
->Proper.Movie.Title.2013.avi
->Proper.Movie.Title.2013.srt
Title 2/
->Title2[proper].mkv
Movie- Epilogue/
->MOVIE EPILOGUE .AVI
Media Movie/
->MEDIAMOVIE.CD1.mkv
->MEDIAMOVIE.CD2.mkv

. . .

所需的目录树:

Proper Movie Title/
->Proper Movie Title.avi
->Proper Movie Title.srt
Title 2.mkv
Movie- Epilogue.avi
Media Movie/
->Media Movie.cd1.mkv
->Media Movie.cd2.mkv

虽然这是一个理想的选择,但我的主要愿望是让只有一个电影文件的目录能够重命名该文件并将其移动到父目录中。

我目前的方法是在 .sh 文件中使用双 for 循环,但我目前很难在脑海中保留新的 bash 知识。

帮助将不胜感激。

我当前的代码(只是为了访问内部电影文件):

#!/bin/bash
FILES=./*
for f in $FILES
do
        if [[ -d $f ]]; then
                INFILES=$f/*
                for file in $INFILES
                do
                        echo "Processing >$file< folder..."
                done
        #cat $f
        fi
done
4

1 回答 1

4

这里有一些简单的东西:

find * -type f -maxdepth 1 | while read file
do
    dirname="$(dirname "$file")"
    new_name="${dirname##*/}"
    file_ext=${file##*.}
    if [ -n "$file_ext" -a  -n "$dirname" -a -n "$new_name" ]
    then
        echo "mv '$file' '$dirname/$new_name.$file_ext'"
    fi
done

表示要对当前目录中的所有项目find *运行查找。表示您只对文件感兴趣,并将搜索的深度限制为直接目录。-type f-maxdepth 1

  • ${file##*.}正在使用模式匹配。说最大的##左手匹配*.基本上是将所有内容都拉到文件扩展名上。
  • file_dir="$(dirname "$file")"获取目录名称。
  • 注意到处都是引号!你必须小心空白。

顺便说一句,我echo没有做实际的举动。我可以将输出通过管道传输到一个文件,检查该文件并确保一切正常,然后将该文件作为 shell 脚本运行。

于 2013-06-13T05:02:44.437 回答