我想替换目录和子目录
上的文件中的链接我正在使用perl命令行:
perl -e "s/\/home\/mydir\/www/\/home\/mydir2/g;" -pi.save $(find home/dir2/dev -type f)
但是我有一个错误:arg list太长了
怎么了?
如何用linux命令行替换文件中的链接?
答案 0 :(得分:3)
似乎您的find
命令会找到这么多文件,以便达到可以传递给进程的最大参数数量。您可以通过键入以下内容在系统中找到此限制:
getconf ARG_MAX
解决方案:使用-execdir
find
选项
find home/dir2/dev -type f -execdir \
perl -e "s/\/home\/mydir\/www/\/home\/mydir2/g;" {} \;
这将为每个文件调用perl命令,而不是将所有文件名作为参数传递给perl。此外,它可以防止您在文件名中出现空格问题和一些潜在的安全问题(与-exec
相反)
答案 1 :(得分:1)
看起来你已经为你的问题找到了一个很好的解决方案。
我想建议对你的Perl做一点改进。替换运算符(s/.../.../
)将接受替代分隔符,以使代码更清晰。
所以你在哪里:
s/\/home\/mydir\/www/\/home\/mydir2/g
您可以将其重写为:
s|/home/mydir/www|/home/mydir2|g
哪个看起来更清楚?