我有一个文件夹在我的桌面上称为“图像”,在该文件夹是3图像.
File-A-B.gif
File-C-D.gif
File-E-F.gif
字符串
.我想在命令行上重命名文件,这样第二个连字符/破折号就被删除了。所以结果会是这样命名的文件...
File-AB.gif
File-CD.gif
File-EF.gif
型
.我正在使用一个命令的组合通过管道传递到对方,但没有太多的运气,让他们工作。
最初我有ls File-* | sed 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh
这个命令的分解是...
- 列出所有开始
File-
的文件 - 将结果通过管道传输到
sed
- 我们将使用
sed
来捕获名称的不同部分 - 查看第一个文件,我们将捕获
File-A
和B.gif
- 使用
sed
,我们然后用move命令替换匹配的文件名,并有效地告诉它将原始文件重命名为由我们捕获的两段数据组成的文件。 - 然后我们将该命令通过管道传输到
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
会出错,因为它不知道使用什么文件扩展名,但是输入一个空String可以消除这个错误(顺便说一句:我的理解是,你还需要使用-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
型
.注意,我不得不避开正斜杠~\/Desktop\/Images\/
,但这仍然不起作用。
我还使用Homebrew安装了sed
的GNU版本,但它也以类似的方式安装了gsed: can't read s/\(Vim-[^-]\)-\(.+\)/mv & \1\2/: No such file or directory
我不知道怎么才能让它工作。
我不想不得不求助于编写bash/zsh脚本或Ruby脚本。
如果你能给我任何给予帮助,我将不胜感激。
3条答案
按热度按时间mnowg1ta1#
如果你正在使用
zsh
,你不需要使用sed
:有一个zsh module calledzmv
可以很简单地实现这一点:字符串
**注意:**省略
-n
以使其实际运行。它的工作原理是匹配括号内的内容。在本例中:
File-(*)-(*).gif
将同时匹配File-A-B.gif
,并保存A
和B
,以便我们稍后可以引用它们。然后,我们将刚刚匹配的文件移动到一个新的文件名,省略两个字母之间的连字符,并使用引用插入字母:File-${1}${2}.gif
。这是一个非常强大的小模块,只要您可以给予两个正则表达式:一个用于匹配要重命名的文件,第二个用于匹配重命名的文件名。
iovurdzv2#
以下方法应该对你有用:
字符串
你所尝试的
型
很接近了。说:
型
反而会奏效
2skhul333#
另一种方法是使用mv,例如:
字符串