use*_*046 8 shell regular-expression rename
我试图用一个圆点,在开始处,并与漏点的空间在年底前(这样命名变更的jpg文件. Startjpg
到Start.jpg
点使文件隐藏sed
并ls -al
列出这些文件,因此我将管道ls -al
传输到sed
. 我已经在线阅读了许多手册,但总是遇到此错误
sed: -e expression #1, char 6: unknown command: `/'
Run Code Online (Sandbox Code Playgroud)
我试过了
ls -al | sed -r '/^\./*.*/g'
ls -al | sed -r '/^\.//g'
ls -al | sed -r '/.*/[\.]g'
ls -al | sed 's/^\./\\1*./g'
Run Code Online (Sandbox Code Playgroud)
还有更多,甚至更多。
我还需要将 filejpg 更改为 file.jpg
使用 Perlrename
工具(rename
在 Debian 和朋友包括 Ubuntu 上调用,它可能在prename
其他地方):
rename -n 's/(?<!\.)jpg$/.jpg/' * # -n makes it show you what it'll do,
# but not actually do it. Remove the -n to
# actually rename
Run Code Online (Sandbox Code Playgroud)
打破这种模式:jpg$
意思是“以'jpg'结尾”。该(?<!\.)
手段“有没有那么前点‘JPG’”阻止你改变foo.jpg
成foo..jpg
,这将是愚蠢的。
的*
是正常壳通配符; rename
需要考虑重命名的文件列表。您当然可以执行/path/to/dir/*
、传递文件名列表、与 结合使用find
等。
从一开始就删除点和空格也很容易:
rename -n 's/^[. ]+//' * # trying -n first is good practice
Run Code Online (Sandbox Code Playgroud)
这将删除开头的所有点和空格。它会. . . foo
变成foo
.
通常,*
shell 扩展不会产生名称以点开头的文件(隐藏文件)。一种选择是使用.*
; 这也会产生两个特殊条目.
(当前目录)和..
(父目录)。在这种情况下,这应该是无害的;第一个命令将忽略它们(它们不以 结尾jpg
);第二个命令将尝试重命名它们,但这只会产生错误。另一种方法是找到:
find -type f -exec rename -n 's/^[. ]+//' '{}' +
Run Code Online (Sandbox Code Playgroud)
-type f
将仅限于文件。您当然也可以使用任何 find 的其他选项。