【问题标题】:Ubuntu: Rename multiple files in different directoryUbuntu:重命名不同目录中的多个文件
【发布时间】:2018-10-09 16:13:20
【问题描述】:

我需要重命名此结构中的文件:

Dir1
--file1
--file2
--  ... 
Dir2
--file1
--file2
--  ... 
... 
Dir62
--file1101
--file1102
--  ...

新名称将是第一个目录中的 1_01,1_02 和第二个目录中的 2_01,2_02 等等...

有没有办法一次性完成...

目前,我正在使用:

ls | cat -n | while read n f; do mv "$f" "10_$n.png"; done

一次在 1 个目录中工作...

请问有更好的方法吗?

【问题讨论】:

  • 这太疯狂了。为什么要这么做?这些文件将以任意名称结束,其中包含一个前缀,该前缀取决于ls 的排序顺序,并且与包含该文件的目录的名称无关,而后缀与其原始名称失去任何关系。
  • 因此,如果列出的第一个目录是Dir7,并且其中的第一个文件是file8,它将最终成为Dir7/1_01...
  • @MarkSetchell,我必须重命名这些文件以进行机器学习。为此,他们的名字应该采用某种格式。文件的顺序无关紧要,直到它们留在自己的目录中......

标签: bash ubuntu rename


【解决方案1】:

如果您运行此命令,它将使用 GNU Parallel 在每个目录中并行启动一个新的bashshell,并在每个目录中独立地并行运行ls

parallel --dry-run -k 'cd {} && ls' ::: */

样本输出

cd Dir01/ && ls
cd Dir02/ && ls
cd Dir78/ && ls

如果您删除--dry-run,它会真正做到这一点。

所以,现在让我们看看在每个目录中使用rename 命令,而不是运行ls。以下将重命名目录中的所有文件,编号依次递增($N):

rename --dry-run '$_=$N' *

样本输出

'file87' would be renamed to '1'
'file88' would be renamed to '2'
'file89' would be renamed to '3'
'fred' would be renamed to '4'

上述所有建议您想要的命令是:

parallel --dry-run -k 'cd {} && rename --dry-run "s/.*/{#}_\$N/" *' ::: */

您可以按原样运行它,它只会向您显示它将要做什么,而无需实际执行任何操作。

如果您喜欢它的外观,请删除第一个 --dry-run 并再次运行它,它实际上会进入每个子目录并执行重命名的试运行,再次没有实际更改任何内容。

如果您仍然喜欢该命令的外观,请在临时目录中的某处制作一份文件的小副本,然后尝试删除 --dry-run 参数以及是否符合您的需要。

【讨论】:

  • 它适用于空运行,但实际存在错误。 - "Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code). " 我尝试初始化 $N 一些值,也将它创建为环境变量,但仍然没有工作... $N 是什么?
  • 如果您在手册页中查看rename,您会看到$N 只是一个按顺序递增的数字,每个文件都会增加。像我给出的第二个例子一样尝试。有几个rename 程序在那里,所以你可能有一个不同的 - 我正在使用的是一个 Perl 脚本,所以检查你的是否也是...... file $(which rename)
【解决方案2】:
ls -1 -d ./*/ | cat -n | xargs -I % bash -c 'echo "%" | while read dirnum dirname; do { ls "${dirname}" | cat -n | while read filenum filename; do { mv -v "${dirname}${filename}" "${dirnum}_${filenum}.png"; }; done }; done'

我们用mkdir和touch创建一个目录结构:

mkdir Dir{1,2,3,4,5}
touch Dir{1,2,3,4,5}/file{1,2,3}

结果如下:

1_1.png
1_2.png
1_3.png
2_1.png
2_2.png
2_3.png
3_1.png
3_2.png
3_3.png
4_1.png
4_2.png
4_3.png
5_1.png
5_2.png
5_3.png

【讨论】:

  • 它在某种程度上确实有效。它重命名了所有文件 - 但是,将所有文件从子目录移动到主目录 - 我最终在 1 个主目录中有 70k 个文件。
猜你喜欢
  • 2016-07-22
  • 2018-11-01
  • 1970-01-01
  • 2012-12-27
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2012-06-14
相关资源
最近更新 更多