我在某个位置(/subdirectory1
)有几十个bash脚本,文件中的路径名(pathname1
)不正确。对于该子目录中的所有bash脚本pathname2
,我想以某种方式用*.sh
替换此路径名。
有没有标准的方法来做到这一点?
在perl中,如果我使用单个文件file1
,我会执行:
perl -pi -e 's/pathname1/pathname2/g' file1
如何为所有文件*.sh
完成此操作?
它不一定是perl,但这是我想到的一种方式。我怀疑还有一种方法可以使用其他shell脚本和其他语言 - 我很乐意编辑这个问题以缩小选项范围。
答案 0 :(得分:2)
您可以先运行find
列出文件,然后运行perl
或sed
或其他任何内容:
find . -name '*.sh' -exec <perl_command> {} \;
请注意{} \;
,这意味着为每个find
输出运行此功能。
答案 1 :(得分:2)
只列出所有文件名,它们都是逐行处理的
perl -pi -e 's{pathname1}{pathname2}g' *.sh
其中{}
用于分隔符,因此路径中的/
无需转义。
这假设*.sh
指定了您需要的文件。
我们可以通过运行
看到这种情况perl -MO=Deparse -ne '' file1 file2
输出
LINE: while (defined($_ = <ARGV>)) {
'???';
}
-e syntax OK
这是相当于单行的代码,由-MO=Deparse
提供。它告诉我们循环是通过输入设置的,由<ARGV>
提供。
那么这里的<ARGV>
是什么?来自I/O Operators in perlop
空文件句柄
<>
是特殊的:...来自<>
的输入来自标准输入,或来自命令行中列出的每个文件。
,其中
的同义词
<>
只是<ARGV>
因此输入将是所有提交文件的所有行。
答案 2 :(得分:1)
只需使用文件glob:
perl -pi -e 's@pathname1@pathname2@g' *.sh
这将处理包含空格的病理文件名。