将文件夹中的文件重命名为文件夹名称,同时保留扩展

时间:2013-06-13 01:08:18

标签: bash shell

我有一个庞大的媒体文件存储库,它们遵循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文件中使用双循环,但我现在很难将新的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

1 个答案:

答案 0 :(得分: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脚本运行。