Shell-Script
創建一個腳本,為目錄中的所有文件執行一個簡單的命令
我需要使用基於文本的瀏覽器 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 ' _ {} +