剥离空格并将小写字母设置为连字符 - 文件名

时间:2014-10-06 14:35:21

标签: linux bash ubuntu filenames rename

我有很多文本文件,我使用特定格式重命名。下面我能够删除空格并制作小写。但是,这不是理想的结果。

我如何能够在连字符上格式化(取出空格并制作小写)所有内容,然后在连字符后面只取第一个空格?

find /temp/ -depth -name "* *" -type f -exec rename 's/ +\././; y/A-Z /a-z_/' {} +

输入结果:

Hello Video - KEEP.txt

输出:

hello_video_-_keep.txt

期望的结果:

hello_video_-KEEP.txt

2 个答案:

答案 0 :(得分:3)

如果是我要使用的文件:

sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1-\U\2/' -e 's/ /_/g' file
  • s/^([^-]*)-\s*([^\.]*)/\L\1-\U\2/转换为从文件开头到短划线-的所有内容。然后它转换为大写直到点。
  • s/ /_/g将所有空格转换为下划线_

对于您给定的文本,它返回:

hello_video_-KEEP.txt

如果您希望保持-.之内的单词,请使用\E恢复大小写。然后,我们也可以通过将其替换为_-(我知道有点难看)来摆脱多余的-

$ cat file
Hello Video - KEEP.txt
My File - KeEp.txt
$ sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g' file
hello_video-KEEP.txt
my_file-KeEp.txt

提醒一下,这些是改变大写/小写的方法:

  • \L - 将所有进行中的字符转换为小写
  • \U - 将所有进行中的字符转换为大写
  • \E - 将所有正在进行的字符保留为当前案例

你怎么标记它有效?循环遍历find命令的结果:

while read -r file
do
   new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g')
   echo "mv '$file' '$new_file'"
done < <(find . -type f ...)

对于给定的输入,这将产生以下内容:

mv './My File - KeEp.txt' './my_file-KeEp.txt'
mv './Hello Video - KEEP.txt' './hello_video-KEEP.txt'

一旦确定无效,只需删除echo并单独使用mv即可。注意报价是必要的!!否则,它无法正确处理文件名中的空格。

答案 1 :(得分:1)

您可以使用\L转换为小写:

rename 's/ +\././; y/ /_/; s/(.*?-)/\L$1/'