ディレクトリ内のすべてのファイルに対して単純なコマンドを実行するスクリプトの作成

ディレクトリ内のすべてのファイルに対して単純なコマンドを実行するスクリプトの作成

テキストベースのブラウザLynxを使用して、1000個のhtmlファイルを同じファイル名のテキストファイルにダンプする必要があります。

与えられたfilename.htmlのコマンドは次のようになります。

lynx filename.html --force-html --dump > filename.txt

問題は、これらのファイルが数万個あることです。

lynx *.html --force-html --dump *.html.

答え1

lynx別々の出力ファイルを作成するには、各ファイルに対してこれを一度実行する必要があります。複数のファイルに対して特定の操作を順次実行するには、次のようにします。forループ。これ模様 *.html。で終わる現在のディレクトリのすべての名前と一致します.html

for x in *.html; do … done

ループが実行されるたびに、変数はx現在のファイル名を指定します。ファイル名を引用する場合"$x"(二重引用符を忘れないでください。そうしないと、スクリプトはいくつかのファイル名(スペースを含む)で中断されます)

.txtファイル名を作成するには、.html値からサフィックスを削除してサフィックスをx追加します。.txt一つあるパラメータ拡張サフィックスを引いた変数値を取得するように構成されています。"${VARIABLE%SUFFIX}"

for x in *.html; do
  lynx --force-html --dump "$x" >"${x#.html}.txt"
done

サブディレクトリのHTMLファイルで作業したい場合は、2つの可能性があります。シェルがbash、ksh、またはzshの場合は、この**モードを使用してサブディレクトリに再帰できます。 Bashでは、shopt -s globstarこの機能を最初に有効にする必要があります。 Kashmirではset -o globstar

shopt -s globstar
for x in **/*.html; do
  lynx --force-html --dump "$x" >"${x#.html}.txt"
done

または以下を使用してください。find注文する。ファイル名を操作する必要があるため、findシェルを実行する必要があります。

find . -name '*.html' -exec sh -c '
  lynx --force-html --dump "$0" >"${0#.html}.txt"
' {} \;

$0次の最初のパラメータです。一括でシェルを実行することは、forループと組み合わせることによって(より多くのファイル名が各単一のシェル呼び出しに渡されることを示す)を使用して高速化することができます。 「除外し、シェルのコマンドライン引数を繰り返します」を意味します。sh -c CODEfind-exec … {} +findfor x do$0

find . -name '*.html' -exec sh -c '
  for x; do lynx --force-html --dump "$x" >"${x#.html}.txt"; done
' _ {} +

答え2

( set ./*.html; [ -f "$1" ] || exit
  printf 'eval "$L;shift" >"${1%%%.0s.*}.txt"\n' "$@" |
  L='    lynx "$1" --force-html --dump'  sh -eCs "$@"
) &

答え3

for x in *.html;do
    lynx $x --force-html --dump >${x%%.html}.txt
done

関連情報