Shell-Script

創建一個腳本,為目錄中的所有文件執行一個簡單的命令

  • June 28, 2015

我需要使用基於文本的瀏覽器 Lynx 將 1000 個 html 文件轉儲到具有相同文件名的文本文件中。

對於任何給定的 filename.html,命令是

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

問題是我有成千上萬的這些文件。

如果我使用lynx *.html --force-html --dump *.html我不認為每個文件都會生成具有相同名稱的文本文件。

您需要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 文件進行操作,則有兩種可能性。如果您的 shell 是 bash、ksh 或 zsh,您可以使用該**模式遞歸到子目錄。在 bash 中,需要先啟用此功能shopt -s globstar;在 ksh 中,與set -o globstar.

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

或者,使用find命令。由於您需要對文件名進行一些操作,因此您需要find執行一個 shell。

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

$0是 之後的第一個參數。分批執行 shell 會快一點,結合(使用,指示將多個文件名傳遞給每個 shell 呼叫)與 for 循環。意思是“遍歷shell的命令行參數,除了”。sh -c *CODE*``find``-exec … {} +``find``for x do``$0

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

引用自:https://unix.stackexchange.com/questions/212316