我正在处理某些事情,需要解决以下问题。我正在给出一个类似版本的地雷问题。重命名和重定位文件的Shell脚本
假设我们有一个音乐目录,其中有200个目录对应不同的电影。在每个电影目录中都有一些音乐文件。
现在,说一个文件music.mp3位于文件夹movie.mp3中。我想制作一个shell脚本,以便将文件重命名为movie_music.mp3并将其放入我提到的某个文件夹中。基本上,子目录中的所有文件都将被重命名并放入新的目录中。
针对此问题的任何解决方法?
我正在处理某些事情,需要解决以下问题。我正在给出一个类似版本的地雷问题。重命名和重定位文件的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 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
假设下面的目录树:
./movie1:
movie1.mp3
./movie2:
movie2.mp3
下面的一行代码将创建 'MV' 命令,你可以使用:
find ./ | grep "movie.*/" | awk '{print "mv "$1" "$1}' | sed 's/\(.*\)\//\1_/'
编辑:
如果目录结构只包含相关目录,您可以扩展使用下面的grep代替:
grep "\/.*\/.*"
注意它看起来至少有一个目录和一个文件的文件。如果你有多个内部目录,它将不够好。
击:
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
没有限制,文件是MP3。他们可以是任何媒体类型,如wav,mpg等。 – w2lame 2010-10-04 06:06:39
@ abhishekgupta92我更新了脚本以查找当前目录下每个目录下的所有文件,并将它们移动到'$ newdir'。你必须意识到,如果你将所有这些文件移动到一个目录中,你将面临丢失文件的风险。您可以通过重命名文件(比如's/\ // _-_/g')来降低风险,但这并不能消除风险。 – wilhelmtell 2010-10-04 13:45:54
它可以容纳空间以及目录和文件的名字 – w2lame 2010-10-04 06:15:34
脚本给我以下错误:歌曲/ ZINDA/Kabhi Muskura Ke.mp3 - > test/ZINDA_Kabhi Muskura Ke.mp3 mv:target'Ke.mp3 '不是目录 – w2lame 2010-10-04 06:39:19
不,它在空格上打断,因为'basename'没有正确引用。更正确的将是'mv -v - “$ file”“$ 2/$(basename - ”$ dir“)_ $(basename - ”$ file“)”'“或类似的东西 – Philipp 2010-10-04 07:57:37