我有很多的,我正与一个特定的格式重新命名的文本文件。 下面我能够删除空格,使小写。 然而,这不是理想的结果。
我将如何能够格式化(去掉空格,使小写)一切行动的连字符,然后连字符后仅取第一个空格?
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
如果这是一个文件,我会用:
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
孤单。 注意引号是必要的! 否则,将不能正确处理文件名中的空间。
您可以使用\L
要转换为小写:
rename 's/ +\././; y/ /_/; s/(.*?-)/\L$1/'