重命名一系列文件

发布于 2024-07-19 04:59:38 字数 555 浏览 5 评论 0原文

尝试重命名 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

巾帼英雄 2024-07-26 04:59:39

GNU 并行 http://www.gnu.org/software/parallel/ 有 {. } 删除扩展名:

find . -type f -wholename \*.mbox -print0 | parallel -0 mv {} {.}

如果您知道文件名不包含 \n 那么这也将起作用:

find . -type f -wholename \*.mbox | parallel mv {} {.}

GNU Parallel http://www.gnu.org/software/parallel/ has {.} that removes the extension:

find . -type f -wholename \*.mbox -print0 | parallel -0 mv {} {.}

If you know the filenames do not contain \n then this will work aswell:

find . -type f -wholename \*.mbox | parallel mv {} {.}
暮光沉寂 2024-07-26 04:59:39

我想你需要这个:(

find . -wholename \*.mbox | awk '{new=$0; gsub("\.mbox$", "", new) ; system("mv \"" $0 "\" \"" new "\"") }'

应该是 gawk 和 mawk 兼容,在 mawk 上测试)。 它不使用 xargs,但请注意,它不会为每个移动的文件创建一个新进程。 如果您需要移动大量文件,您会注意到这一优势。 警告:如果任何文件的名称中包含换行符,您就会遇到麻烦(但如果这是一个问题,上帝与您同在)。

您可以通过使用 xargs 在一次 rm 调用中删除多个文件来进一步增强此解决方案。

如果您确实需要速度,我建议您使用 python 脚本而不是 awk。 这将在没有一个 fork 的情况下完成所有的 rm 操作。

I think You need this:

find . -wholename \*.mbox | awk '{new=$0; gsub("\.mbox$", "", new) ; system("mv \"" $0 "\" \"" new "\"") }'

(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.

伪心 2024-07-26 04:59:39

你能使用重命名(1)吗? 它带有 perl。

Could you use rename(1)? It comes with perl.

回首观望 2024-07-26 04:59:39

您可以尝试:

find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//'

您的问题是尝试通过管道输入 xargs。 到那时 "{}" 就没有任何意义了。

重命名文件(假设你在 bash 下)

find . -type f -wholename \*.mbox -print0 | \
    while read I ; do
        mv $I $(echo $I | sed 's/\.mbox//') ;
    done ;

You can try:

find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//'

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)

find . -type f -wholename \*.mbox -print0 | \
    while read I ; do
        mv $I $(echo $I | sed 's/\.mbox//') ;
    done ;
独﹏钓一江月 2024-07-26 04:59:39

给你,这应该可以解决问题......

# find .
.
./test.tst
./test1.tst
./test2.tst
./test/test4.tst
./test/test5.tst

#

for file in `find . -type f`
do
mv $file ${file%.tst}.new
done

# find .
.
./test
./test/test4.new
./test/test5.new
./test1.new
./test2.new

Here you go, this should do the trick....

# find .
.
./test.tst
./test1.tst
./test2.tst
./test/test4.tst
./test/test5.tst

#

for file in `find . -type f`
do
mv $file ${file%.tst}.new
done

# find .
.
./test
./test/test4.new
./test/test5.new
./test1.new
./test2.new
度的依靠╰つ 2024-07-26 04:59:38

尝试一下

find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh

,如果某些文件包含双引号字符,这并不是 100% 的万无一失,但我认为您可以忽略它:)

Try

find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh

This is not 100% fool proof should some of the files contain double quote characters, but I assume you can ignore that :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文