2013-06-13 73 views
0

我有一个大型的媒体文件存储库,它遵循Torrent命名约定 - 令人不快的阅读内容。有一次,我已经正确地命名了包含所述文件的文件夹,但不想将所有.avi,.mkv等文件转储到我的主要媒体目录中,使用bash脚本。将文件夹内的文件重命名为文件夹名称,同时保留扩展名

概述: 当前目录树:

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文件中使用double 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 
+1

快速解决方案是对盗版说不!购买电影,他们将有适当的标题。 –

+0

显示你已经尝试过的,我们不是在这里为你写你的代码。 – Barmar

+0

添加了我正在思考的代码。 – SWPhantom

回答

3

这里的东西很简单:

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脚本运行。

+0

这太好了,大卫。非常感谢。 是否有确定的方法来检测目录中有多少文件? “| wc”命令似乎不返回文件数量,而是返回目录内的单词数量。 我想有一个条件,只有在目录中有<= 2个文件时才执行给定的代码。 – SWPhantom

+0

@SWPhantom命令'wc -l'将返回_lines_,而不是单词。见所有各种选项的'man wc'。 –

相关问题