2010-10-04 162 views
2

我正在处理某些事情,需要解决以下问题。我正在给出一个类似版本的地雷问题。重命名和重定位文件的Shell脚本

假设我们有一个音乐目录,其中有200个目录对应不同的电影。在每个电影目录中都有一些音乐文件。

现在,说一个文件music.mp3位于文件夹movie.mp3中。我想制作一个shell脚本,以便将文件重命名为movie_music.mp3并将其放入我提到的某个文件夹中。基本上,子目录中的所有文件都将被重命名并放入新的目录中。

针对此问题的任何解决方法?

回答

2

此脚本接收两个参数:源文件夹和目标文件夹。它将源目录下的每个文件的任何目录下移动到新目录中的新文件名:

#!/bin.sh 
echo "Moving from $1 to $2" 
for dir in "$1"/*; do 
    if [ -d "$dir" ]; then 
    for file in "$dir"/*; do 
     if [ -f "$file" ]; then 
     echo "${file} -> $2/`basename "$dir"`_`basename "${file}"`" 
     mv "${file}" "$2"/`basename "$dir"`_`basename "${file}"` 
     fi 
    done 
    fi 
done 

这里有一个例子:

 
bash move.sh dir dir2 
Moving from dir to dir2 
dir/d1/f1 -> dir2/d1_f1 
dir/d1/f2 -> dir2/d1_f2 
dir/d2/f1 -> dir2/d2_f1 
dir/d2/f2 -> dir2/d2_f2 
+0

它可以容纳空间以及目录和文件的名字 – w2lame 2010-10-04 06:15:34

+0

脚本给我以下错误:歌曲/ ZINDA/Kabhi Muskura Ke.mp3 - > test/ZINDA_Kabhi Muskura Ke.mp3 mv:target'Ke.mp3 '不是目录 – w2lame 2010-10-04 06:39:19

+2

不,它在空格上打断,因为'basename'没有正确引用。更正确的将是'mv -v - “$ file”“$ 2/$(basename - ”$ dir“)_ $(basename - ”$ file“)”'“或类似的东西 – Philipp 2010-10-04 07:57:37

0

假设下面的目录树:

./movie1: 
movie1.mp3 

./movie2: 
movie2.mp3 

下面的一行代码将创建 'MV' 命令,你可以使用:

find ./ | grep "movie.*/" | awk '{print "mv "$1" "$1}' | sed 's/\(.*\)\//\1_/' 

编辑:

如果目录结构只包含相关目录,您可以扩展使用下面的grep代替:

grep "\/.*\/.*" 

注意它看起来至少有一个目录和一个文件的文件。如果你有多个内部目录,它将不够好。

+0

无德是什么样MOVIE1 ..说电影命名为蜘蛛侠,另一部名为泰坦尼克号的电影。 – w2lame 2010-10-04 06:05:55

+0

你的权利,我修改了grep – Amirshk 2010-10-04 06:11:14

+0

它没有照顾文件中的空间。可能首先重命名文件以删除空格并用破折号替换它们会有所帮助。 – w2lame 2010-10-04 06:43:27

1

击:

newdir=path/to/new_directory; 
find . -type d |while read d; do 
    find "$d" -type f -maxdepth 1 |while read f; do 
    movie="$(basename "$d" |sed 's/\(\..*\)\?//')" 
    mv "$f" "$newdir/$movie_$(basename $f)"; 
    done; 
done 
+0

没有限制,文件是MP3。他们可以是任何媒体类型,如wav,mpg等。 – w2lame 2010-10-04 06:06:39

+0

@ abhishekgupta92我更新了脚本以查找当前目录下每个目录下的所有文件,并将它们移动到'$ newdir'。你必须意识到,如果你将所有这些文件移动到一个目录中,你将面临丢失文件的风险。您可以通过重命名文件(比如's/\ // _-_/g')来降低风险,但这并不能消除风险。 – wilhelmtell 2010-10-04 13:45:54