디렉터리의 모든 파일에 대해 간단한 명령을 실행하는 스크립트 만들기

디렉터리의 모든 파일에 대해 간단한 명령을 실행하는 스크립트 만들기

텍스트 기반 브라우저 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 파일에도 작업하려는 경우 두 가지 가능성이 있습니다. 쉘이 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

관련 정보