在Solaris机器上使用特殊字符重命名文件和目录

在Solaris机器上使用特殊字符重命名文件和目录

以下代码(命令)的目标是重命名文件/目录,并且还支持带有特殊字符“@”或“.”的文件/目录。 ETC

这些命令在 Linux 上运行良好,没有任何问题,

 export NAME_THAT_WE_WANT_TO_CHANGE='.com'
 export NEW_NAME='@google'
 find /tmp -name '*.com*' -print0 | xargs -0  ./rename.pl   's/\Q$ENV{NAME_THAT_WE_WANT_TO_CHANGE}\E/$1$ENV{NEW_NAME}$2/'

例如文件

/tmp/star.com 
/tmp/public.com

运行以下命令后将被替换

/tmp/star@google 
/tmp/public@google

所以现在我尝试隐藏 find 语法以支持 Solaris 机器(Solaris 10)

这是我为 Solaris 编写的内容:

  export NAME_THAT_WE_WANT_TO_CHANGE='.com'
  export NEW_NAME='@google'

  find /tmp -name '*.com*' -exec ./rename.pl  {} + 's/\Q$ENV{NAME_THAT_WE_WANT_TO_CHANGE}\E/$1$ENV{NEW_NAME}$2/'

但是当我运行 find 行时...(我收到以下错误)

find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

请建议我需要在语法中修复什么才能支持Solaris机器?

  • 关于我从( http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm

     more /tmp/rename.pl
     #!/usr/bin/perl
     #
     # rename script examples from lwall:
     #       rename 's/\.orig$//' *.orig
     #       rename 'y/A-Z/a-z/ unless /^Make/' *
     #       rename '$_ .= ".bad"' *.f
     #       rename 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *
    
     $op = shift;
     for (@ARGV) {
     $was = $_;
     eval $op;
     die $@ if $@;
     rename($was,$_) unless $was eq $_;
     }    
    

答案1

{} \;参数{} +仅在结尾的命令,方法xargs有效。

这不是 Solaris 问题。

其中的示例rename.pl清楚地显示了命令末尾的文件名。

尝试:

find /tmp -name '*.com*' -exec ./rename.pl  \
  's/\Q$ENV{NAME_THAT_WE_WANT_TO_CHANGE}\E/$1$ENV{NEW_NAME}$2/' {} +

“@“ 和 ”。”在此上下文中不计算特殊字符。您需要find -print0xargs -0稳健地处理所有文件名(例如,名称中嵌入换行符)。您也可以find ...| xargs ...在 Solaris 上使用相同的方法,尽管没有“0”选项,除非您安装 GNU findutils 并使用gfindgxargs正如 @vonbrand 所建议的那样。

相关内容