Find
在 Solaris 機器上使用特殊字元重命名文件和目錄
以下程式碼( 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 機器?
- 關於我從( http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm)獲取的 rename.pl 腳本
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 的建議使用。