以下代码(命令)的目标是重命名文件/目录,并且还支持带有特殊字符“@”或“.”的文件/目录。 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 行时...(我收到以下错误)
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
并xargs -0
稳健地处理所有文件名(例如,名称中嵌入换行符)。您也可以find ...| xargs ...
在 Solaris 上使用相同的方法,尽管没有“0”选项,除非您安装 GNU findutils 并使用gfind
和gxargs
正如 @vonbrand 所建议的那样。