![ディレクトリ内のファイルの内容を検索し、値を追加する Bash スクリプト](https://rvso.com/image/1490209/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%80%81%E5%80%A4%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%20Bash%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88.png)
膨大な数のファイルがあるディレクトリがあります。Bashスクリプトを書きたいのですが、
- そのディレクトリに入る
- どれが Perl スクリプトであるかを調べます (ただし、拡張子が .pl のものは存在しません)
- 各行の先頭に1行追加します(新しいシェバンを追加するつもりです)Perlスクリプトでない場合は何もしません
Perl スクリプトを検索できません。grep を使用してみましたが、適切なコマンドが取得できません。また、3 番目のステップでも行き詰まっています。
答え1
perl ファイルを見つけるためにできる最善のことは、perl 自体を使用して判断することです。パール -cファイルが正しい Perl コードでない場合は、ゼロ以外の終了コードを返します。これは、Perl ではないほとんどのファイルで間違いなく当てはまります。残念ながら、欠陥のある Perl コードが入力された場合も同じ結果になり、ファイルが実際には Perl コードではないが、Perl コードであるかのようにエラーなしで解析できる場合は 0 を返します。そのリスクを受け入れられるのであれば、その核心は次のようになります。
for FILE in * ; do
if perl -c "$FILE" >/dev/null ; then
sed -i -e '1i#!/usr/bin/perl' "$FILE"
fi
done
注: いずれにせよ、ファイルに触れる場合は、本当に重大な理由がない限り、.pl 拡張子を追加します。