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 的其他选项。