重命名一系列文件
尝试重命名 Linux 服务器上的一系列文件。 找到我想要的文件很容易:
find . -type f -wholename \*.mbox
当然,作为 mbox 文件,其中一些文件的名称中有空格,所以它变成:
find . -type f -wholename \*.mbox -print0
我正在通过管道传输到 xargs,以便我可以重命名文件:
find . -type f -wholename \*.mbox -print0 | xargs -0 -I{} echo ${"{}"/.mbox/}
echo 应该返回类似 INBOX 的内容,然而,给定 INBOX.mbox,bash 抱怨:
bash: ${"{}"/.mbox/}: bad substitution
我该如何解决这个问题? 如果可能的话,我想尝试将其保留在 find/xargs 解决方案中,这样我就不会在其周围添加大量循环结构。
Trying to rename a series of files on a linux server. Finding the files I want is easy:
find . -type f -wholename \*.mbox
Of course, being mbox files, some of them have spaces in the names, so it becomes:
find . -type f -wholename \*.mbox -print0
I'm piping to xargs so that I can rename the files:
find . -type f -wholename \*.mbox -print0 | xargs -0 -I{} echo ${"{}"/.mbox/}
The echo should return something like INBOX, given INBOX.mbox, however, bash complains:
bash: ${"{}"/.mbox/}: bad substitution
How can I fix this? I'd like to try to keep it in a find/xargs solution if possible, so that I'm not adding a lot of looping constructs around it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
GNU 并行 http://www.gnu.org/software/parallel/ 有 {. } 删除扩展名:
如果您知道文件名不包含 \n 那么这也将起作用:
GNU Parallel http://www.gnu.org/software/parallel/ has {.} that removes the extension:
If you know the filenames do not contain \n then this will work aswell:
我想你需要这个:(
应该是 gawk 和 mawk 兼容,在 mawk 上测试)。 它不使用 xargs,但请注意,它不会为每个移动的文件创建一个新进程。 如果您需要移动大量文件,您会注意到这一优势。 警告:如果任何文件的名称中包含换行符,您就会遇到麻烦(但如果这是一个问题,上帝与您同在)。
您可以通过使用 xargs 在一次
rm
调用中删除多个文件来进一步增强此解决方案。如果您确实需要速度,我建议您使用 python 脚本而不是 awk。 这将在没有一个 fork 的情况下完成所有的 rm 操作。
I think You need this:
(should be both gawk and mawk compatible, tested on mawk). It doesn't use xargs, but note that it doesn't fork a new process for every file moved. If You need to move a large amount of files, You'll notice the advantage. Warrning: if any of the files will contain a newline in it's name, You'll get in trouble (but if this is an issue, God be with You).
You further enhance this solution by using xargs to delete multiple files on a single
rm
invocation.If You really need speed, I'd suggest that You use a python script instead of awk. That will do all the
rm
's without a single fork.你能使用重命名(1)吗? 它带有 perl。
Could you use rename(1)? It comes with perl.
您可以尝试:
您的问题是尝试通过管道输入 xargs。 到那时
"{}"
就没有任何意义了。重命名文件(假设你在 bash 下)
You can try:
Your problem is in trying to pipe into xargs. By that point
"{}"
doesn't mean anything.To rename the files (Assuming you are under bash)
给你,这应该可以解决问题......
Here you go, this should do the trick....
尝试一下
,如果某些文件包含双引号字符,这并不是 100% 的万无一失,但我认为您可以忽略它:)
Try
This is not 100% fool proof should some of the files contain double quote characters, but I assume you can ignore that :)