【发布时间】:2017-06-18 21:09:36
【问题描述】:
我正在尝试通过截断文件名中第一个空格出现的文件来批量重命名某些文件。我编写了一个简单的脚本来重命名:
for i in *.fa; do rename 's/\s.*//' *.fa; done
这在测试中工作得很好,并根据需要产生以下结果:
$:~/testenv$ ls
NM_000016.5_LastMex1_4_12 23 0 1 KB882088_3062975-30.fa NM_000016.5_PastMex1_4_12 23 0 1 KB882088_3062975-30.fa
$:~/testenv$ for i in *.fa; do rename 's/\s.*//' *.fa; done
$:~/testenv$ ls
NM_000016.5_LastMex1_4_12 NM_000016.5_PastMex1_4_12
不幸的是,我必须对很多文件执行此操作,大约 670 万个。这给了我以下错误:
/usr/bin/rename: Argument list too long
我已经尝试了所有我能想到的技巧,即使我使用 find 它似乎也无法获取文件。
$:~/testenv$ ls
NM_000016.5_astMex1_4_12 23 0 1 KB882088_3062975-30.fa NM_000016.5_PastMex1_4_12 23 0 1 KB882088_3062975-30.fa
NM_000016.5_LastMex1_4_12 23 0 1 KB882088_3062975-30.fa
$:~/testenv$ find . -maxdepth 1 -type f -exec sh -c 'rename 's/\s.*//' *.fa' _ {} \;
find: `./NM_000016.5_PastMex1_4_12 23 0 1 KB882088_3062975-30.fa': No such file or directory
find: `./NM_000016.5_astMex1_4_12 23 0 1 KB882088_3062975-30.fa': No such file or directory
任何帮助将不胜感激。
【问题讨论】:
-
for i in *.fa; do rename 's/\s.*//' *.fa; done,当它工作时,重命名所有 .fa 文件每个文件一次,这意味着,如果你有 1000 个文件,你将重命名所有 1000 个文件 1000次,总计 1,000,000 次潜在操作。这肯定不是你想要的。 -
那些
ls示例如果替换为ls -1Q示例会更容易阅读。 (-1Q每行列出一项,引用。) -
@agc, ...虽然是非 POSIX 扩展,但不能保证 OP(或其他任何人)可以使用它。