![正確な文字列を含むディレクトリ内のすべてのファイルに拡張子を追加します。](https://linux33.com/image/107887/%E6%AD%A3%E7%A2%BA%E3%81%AA%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%90%AB%E3%82%80%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%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
複数のレベルと多くのファイルを含む大きなディレクトリがあります。これらのファイルのすべてではありませんが、ほとんどはHTMLファイルですが、.html
拡張子はありません(Windowsにコピーすると問題が発生します)。
すべてのHTMLファイルには次の内容があります。最初ワイヤー:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
.html
コマンドのみを使用して、その文字列を含むすべてのファイルに拡張子をどのように追加できますか?
私はこれを見たことがあるだから質問はただし、文字列を含めるかどうかによって名前は変わりません。
答え1
拡張子以外のすべての.html
ファイルに拡張子がまったくないと仮定すると、必要なタスクを実行する単純なbashスクリプトがあります。
find . -type f ! -iname "*.html" -a ! -iname "*.htm" | while IFS= read -r file; do
head -1 "${file}" | if grep -q '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' ; then
mv "${file}" "${file}.html"
fi
done
スクリプトは次の操作を順番に実行します。
.html
現在のディレクトリとサブディレクトリで拡張子のないすべてのファイルを繰り返し検索します。- 見つかったファイルの最初の行がユーザーが指定した文字列であることを確認します。
- 最初の行が一致すると、
.html
ファイル名が拡張子を含むように変更されます。
答え2
goldn='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' \
find . -type f \
! -name '*.[hH][tT][mM]' \
! -name '.*.[hH][tT][mM]' \
! -name '*.[hH][tT][mM][lL]' \
! -name '.*.[hH][tT][mM][lL]' \
-exec sh -c '
shift "$1"
while case $# in 0 ) break;; esac
do
read l1 < $1
case $l1 in "$goldn" ) mv "$1" "$1.html";; esac
shift
done
' 2 1 {} +