如何从文件名的开头删除点和空格

use*_*046 8 shell regular-expression rename

我试图用一个圆点,在开始处,并与漏点的空间在年底前(这样命名变更的jpg文件. StartjpgStart.jpg

点使文件隐藏sedls -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

der*_*ert 9

使用 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.jpgfoo..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 的其他选项。