用于重命名和重定位文件的Shell脚本

我正在做一些事情,需要解决以下问题。 我正在给出一个类似于我的问题的版本。

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

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

任何解决方法?

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

#!/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
从目录移到目录2
 dir / d1 / f1  - > dir2 / d1_f1
 dir / d1 / f2  - > dir2 / d1_f2
 dir / d2 / f1  - > dir2 / d2_f1
 dir / d2 / f2  - > dir2 / d2_f2

击:

 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 

假设以下目录树:

 ./movie1: movie1.mp3 ./movie2: movie2.mp3 

以下一行将创建您可以使用的“mv”命令:

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

编辑:

如果您的目录结构仅包含相关的目录,则可以使用下面的grep来代替:

 grep "\/.*\/.*" 

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