Int*_*ist 4 macos shell zsh sed
我的桌面上有一个名为“Images”的文件夹,该文件夹内有 3 个图像...
File-A-B.gif
File-C-D.gif
File-E-F.gif
Run Code Online (Sandbox Code Playgroud)
...我想重命名命令行上的文件,以便删除第二个连字符/破折号。所以结果将是像这样命名的文件......
File-AB.gif
File-CD.gif
File-EF.gif
Run Code Online (Sandbox Code Playgroud)
...我正在使用相互传递的命令组合,但在让它们工作方面运气不佳。
最初我有 ls File-* | sed 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh
这个命令的分解是...
File-sedsed捕获名称的不同部分File-A和B.gifsed我们然后用移动命令替换匹配的文件名,并有效地告诉它的原始文件重命名为数据的两片,我们已经捕获的由一个文件sh我得到的最初错误是权限错误。我不知道为什么,因为我有对文件的“读写”访问权限。
为了解决这个问题,我chmod 777每个文件。
这导致了一个新的错误,即cannot execute binary file.
为了解决这个错误,我看到了这篇文章:http : //blog.mpdaugherty.com/2010/05/27/difference-with-sed-in-place-editing-on-mac-os-x-vs-linux/这建议添加一对额外的单引号。这样做的原因(显然)是因为sed会出错,因为它不知道要使用什么文件扩展名,但是放置一个空字符串可以消除该错误(附带说明:我的理解是您还需要使用-i标志 - 其中我没有使用 - 但这样做会导致一个不同的错误,所以我取消了它并只使用单引号来避免我得到的二进制文件错误)。
所以现在我有 ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh
但是这个错误与No such file or directory?
我试图明确文件的位置,例如......
ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv ~\/Desktop\/Images\/& ~/Desktop\/Images\/\1\2/' | sh
Run Code Online (Sandbox Code Playgroud)
...注意我不得不逃避正斜杠,~\/Desktop\/Images\/但这仍然不起作用。
我还安装了sed使用 Homebrew的 GNU 版本,但它也以类似的方式出错gsed: can't read s/\(Vim-[^-]\)-\(.+\)/mv & \1\2/: No such file or directory
我对如何让它发挥作用感到有些茫然。
我不想求助于编写 bash/zsh 脚本或 Ruby 脚本。
您能给我的任何帮助将不胜感激。
如果您正在使用zsh,则不需要使用sed:有一个名为 zsh 的模块zmv可以非常简单地实现这一点:
$ ls -F -G
File-A-B.gif File-C-D.gif File-E-F.gif
$ zmv -n 'File-(*)-(*).gif' 'File-${1}${2}.gif'
mv -- File-A-B.gif File-AB.gif
mv -- File-C-D.gif File-CD.gif
mv -- File-E-F.gif File-EF.gif
Run Code Online (Sandbox Code Playgroud)
注意:省略-n以使其实际运行。
它通过匹配括号内的内容来工作。在这种情况下:File-(*)-(*).gif将匹配File-A-B.gif并保存A,B以便我们稍后参考它们。然后,我们将刚刚匹配的文件移动到一个新文件名,省略两个字母之间的连字符并使用引用插入字母:File-${1}${2}.gif。
这是一个非常强大的小模块,只要您可以给它两个正则表达式:一个匹配要重命名的文件,第二个匹配重命名的文件名。
以下内容应该适合您:
ls File-* | sed 's/\(.*\)-\(.*\)/mv & \1\2/' | sh
Run Code Online (Sandbox Code Playgroud)
你尝试过什么
ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh
Run Code Online (Sandbox Code Playgroud)
非常接近。说:
ls File-* | sed '' 's/\(File-[^-]*\)-\(.*\)/mv & \1\2/' | sh
Run Code Online (Sandbox Code Playgroud)
相反会起作用。