linux 将文件名中的空格批量重命名为下划线

ijxebb2r  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(175)

我有一个名为windows的目录,其中包含名称包含空格的文件。我想用下划线_替换文件名中的空格。我需要更正windows目录中的所有文件名。

约束条件:

  • 我只能指挥一次。
  • 解决方案不能包含控制结构(if、while、for等)。
  • 解决方案不能包含命令替换$(...),特殊字符,如;,&,&&,${},||等等。

我正在寻找一个解决方案,尊重上述所有限制。任何帮助或指导将不胜感激。谢谢!

lymgl2op

lymgl2op1#

使用内置的-regex条件来匹配文件名,而不是通过管道连接到grep
使用内置的-exec操作符执行bash命令以执行文件名替换和mv命令。
在命令替换中使用sed来执行空间替换。

find windows -type f -regex '/.{4} .{4} .{4}-[0-9A-Za-z]{1,3}$' -exec bash -c 'mv "$1" "$(sed "s/ /_/g" <<<"$1")"' {} {} \;

字符串

w1jd8yoj

w1jd8yoj2#

一条注解澄清了感兴趣的文件名遵循严格的命名约定:
所有文件都遵循特定的模式:四个字母、一个空格、四个字母、一个空格、四个字母、一个连字符和一到三个数字
于是:

find windows -maxdepth 1 -type f |
grep -iE '^windows([/ ][a-z]{4}){3}-[0-9]{1,3}$' |
xargs -r -n3 sh -c 'mv "$*" $1_$2_$3' --

字符串
另一条评论指出:
我只能使用基本的Ubuntu发行版中提供的内容
coreutils(mv)、findutils(find/xargs)、grep(grep)和dash(sh)都是Ubuntu中必需的软件包。
base64也是必需的,允许:

echo ZmluZCB3aW5kb3dzIC1tYXhkZXB0aCAxIC10eXBlIGZ8Z3JlcCAtaUUgJ153aW5kb3dzKFsvIF1bYS16XXs0fSl7M30tWzAtOV17MSwzfSQnfHhhcmdzIC1yIC1uMyBzaCAtYyAnZWNobyBtdiAiJCoiICQxXyQyXyQzJyAt | base64 -d | sh

qmelpv7a

qmelpv7a3#

find windows -depth -exec rename -e 's/ /_/g' {} +

字符串
-depth(如果需要),如果任何带有空格的文件名是目录。
这个rename在某些发行版上以perl-rename的形式提供。
同样的想法,只是没有rename

find windows -depth -exec perl -e'
   use File::Basename qw( fileparse );
   for ( @ARGV ) {
      my $old = $_;
      my ( $f, $d ) = fileparse( $_ );
      $f =~ s/ /_/g;
      my $new = $d.$f;
      rename( $old, $new ) if $new ne $old;
   }
' {} +


同样的想法,但是将循环从perl移动到find,这样你就看不到for了(但是它引入了一个shell特殊字符\):

find windows -depth -exec perl -e'
   use File::Basename qw( fileparse );
   my $old = $ARGV[0];
   my ( $f, $d ) = fileparse( $old );
   $f =~ s/ /_/g;
   my $new = $d.$f;
   rename( $old, $new ) if $new ne $old;
' {} \;

相关问题