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 10)을 지원하기 위해 find 구문을 숨기려고 합니다.

이것은 내가 솔라리스를 위해 쓴 것입니다:

  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

관련 정보