Find

在 Solaris 機器上使用特殊字元重命名文件和目錄

  • March 11, 2013

以下程式碼( commands )的目標是重命名文件/目錄,還支持帶有特殊字元“@”或“。”的文件/目錄。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: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

請建議我需要在語法中修復什麼以支持 solaris 機器?

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 $_;
}    

和參數僅在命令末尾{} \;起作用,這種方式起作用。{} +``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並且xargs -0穩健地處理所有文件名(例如,在名稱中嵌入換行符)。您也可以find ...| xargs ...在 Solaris 上使用相同的方法,但沒有“0”選項,除非您安裝了 GNU findutils 並gfind按照gxargs@vonbrand 的建議使用。

引用自:https://unix.stackexchange.com/questions/67562