Linux 目录名-剥离空白和其他格式

Linux 目录名-剥离空白和其他格式,linux,bash,unix,ubuntu,sed,Linux,Bash,Unix,Ubuntu,Sed,我是bash新手,学习了sed、awk以及该平台提供的更多功能。在我的linux设备中,我有一个包含子目录的音乐目录。这些子目录的名称使用大写字母。我试图使所有的文件夹内,音乐目录的小写和剥离间距。除了在子目录名称中划出空白之外,不更改最后一个连字符后面的任何内容。一个文件可能有许多连字符。我只是在考虑最后一个。我怎么能这样做 while read -r file; do new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/

我是bash新手,学习了
sed
awk
以及该平台提供的更多功能。在我的linux设备中,我有一个包含子目录的音乐目录。这些子目录的名称使用大写字母。我试图使所有的文件夹内,音乐目录的小写和剥离间距。除了在子目录名称中划出空白之外,不更改最后一个连字符后面的任何内容。一个文件可能有许多连字符。我只是在考虑最后一个。我怎么能这样做

while read -r file; do
    new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g')
        if [ "$file" != "$new_file" ]; then
                mv "$file" "$new_file"
        fi
done
例如:

输入

所需结果:

new-survivor_-_ eye_of_the_tiger-12wOlL
当前结果:


更改sed命令,如下所示

$ echo 'New- Survivor - Eye Of The Tiger – 12wOlL' | sed -re 's/^([^-]*-)\s*([^–]*)\s*–/\L\1\L\2–/;s/ /_/g;s/_-_/_-_ /g;s/_–_/-/g'
new-survivor_-_ eye_of_the_tiger-12wOlL

您可以使用此
sed
命令:

s='New- Survivor - Eye Of The Tiger - 12wOlL'
echo "$s" | sed 's/^\(.*\)\(-[^-]*\)$/\L\1\E\2/; s/ *- */-/; s/^\(.*\) \+- *\([^-]*\)$/\1-\2/; s/ /_/g'
new-survivor_-_eye_of_the_tiger-12wOlL

您需要进一步澄清转换规则。为什么
New-Survivor
变成
New-Survivor
但是
Survivor-Eye
变成
Survivor-Eye
并且再次
Tiger-12wOlL
变成
Tiger-12wOlL
-
之后的空格什么时候应该转换为
\uu
以及什么时候应该被剥离?@anubhava我在添加
新-
其他所有内容都是原始文件名。这就是其他连字符被下划线包围的原因。例外情况是第一个和最后一个连字符
$ echo 'New- Survivor - Eye Of The Tiger – 12wOlL' | sed -re 's/^([^-]*-)\s*([^–]*)\s*–/\L\1\L\2–/;s/ /_/g;s/_-_/_-_ /g;s/_–_/-/g'
new-survivor_-_ eye_of_the_tiger-12wOlL
s='New- Survivor - Eye Of The Tiger - 12wOlL'
echo "$s" | sed 's/^\(.*\)\(-[^-]*\)$/\L\1\E\2/; s/ *- */-/; s/^\(.*\) \+- *\([^-]*\)$/\1-\2/; s/ /_/g'
new-survivor_-_eye_of_the_tiger-12wOlL