다음 코드(명령)는 파일/디렉터리 이름 바꾸기를 목표로 하며 특수 문자 "@" 또는 "."가 있는 파일/디렉터리도 지원합니다. 등
이 명령은 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 ...
gfind
gxargs