我有一个文件目录music/artist/{random_name}/{random_music}.ogg
有一个在{random_name}
和不同类型的音乐标题{random_music}
的很多文件夹。
所以,我想重新命名{random_music}.ogg
到music.ogg
。每个{random_name}
文件夹只有一个.OGG文件。
我试着用Bash脚本几个小时,但并没有设法找出。
for f in ../music/artist/*/*.ogg
do
echo mv "$f" "${f/.*.ogg/music.ogg}"
done
它仅重命名我的当前目录下的文件,这将要求替换/覆盖。
我的目标是,我想重新命名所有{random_music}.ogg
文件与例如它们各自的目录music.ogg
,
music/artist/arai/blue.ogg
到music/artist/arai/music.ogg
music/artist/sako/sky.ogg
到music/artist/sako/music.ogg
你的模式替换不正确。因为所有的路径与..
开始,.*.ogg
实际相匹配的整个路径,因此每个文件都变成music.ogg
在当前目录。
你想${f/\/*.ogg/music.ogg}
代替,或者更好,${f%/*}/music.ogg
。这是"$(dirname "$f")"/music.ogg
大致相当于。
我通常这样使用:
for f in ../music/artist/*/*.ogg
do
dest="${f/.*.ogg/music.ogg}"
if [[ $f != "$dest" ]] # nothing to do if name doesn't change
then
if [[ -a $dest ]]
then
printf 'WARNING: File already exists: %s\n' "$dest"
else
mv "$f" "$dest"
fi
fi
done
你可以改变你这样的代码
for f in ../music/artist/*/*.ogg
do
echo mv $f "$(dirname "$f")"/music.ogg
done
这里dirname
将从您的变量中提取目录名,你可以用你的music.ogg
以获得期望的结果追加它。
对于您所提供的示例路径
如果$f
等于music/artist/arai/blue.ogg
,那么结果将是
mv music/artist/arai/blue.ogg music/artist/arai/music.ogg
find ../music/artist/ -type f -name "*.ogg" -exec bash -c 'mydir=`dirname {}`;mv {} $mydir/music.ogg' \;
这是一个班轮,应该工作。它实现了find命令,然后获取目录名和命名原来的文件music.ogg的EXEC选项。
我希望这会帮助你:
先前:
[root@user]# tree music
music
└── artist
├── df
│ └── mp.ogg
├── gh
│ └── pl.ogg
├── jk
│ └── gl.ogg
├── po
│ └── ui.ogg
├── ty
│ └── lk.ogg
└── ui
└── dh.ogg
7 directories, 6 files
源代码:
#!/bin/bash
for i in `ls -ld music/artist/* | awk '{print $9}'`
do
mv $i/*ogg $i/music.ogg
done
执行后:
music
└── artist
├── df
│ └── music.ogg
├── gh
│ └── music.ogg
├── jk
│ └── music.ogg
├── po
│ └── music.ogg
├── ty
│ └── music.ogg
└── ui
└── music.ogg
7 directories, 6 files
正如你可以看到所有的文件得到了正确改名。