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