Solarisシステムで特殊文字を使用してファイルとディレクトリの名前を変更する

Solarisシステムで特殊文字を使用してファイルとディレクトリの名前を変更する

次のコード(コマンド)はファイル/ディレクトリの名前変更を目的としており、特殊文字「@」または「.」を含むファイル/ディレクトリもサポートしています。など

このコマンドは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

これで、Solarisマシン(Solaris 10)をサポートするためにfind構文を非表示にします。

これは私が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 -print0で強力に処理されます。 GNU findutilsをインストールし、@vonbrandが提案したように使用しない限り、「0」オプションはありませんが、Solarisでも同じアプローチを使用xargs -0できます。find ...| xargs ...gfindgxargs

関連情報