bash의 cmd "for"와 동일합니까?

bash의 cmd "for"와 동일합니까?

나는 bash(또는 Linux 쉘)에 대해 거의 알지 못하지만 bash만 사용합니다. 나는 Windows에서 cmd를 사용하는 데 익숙하며 for %c in (*.*) do {something}cmd가 없으면 불편하다고 느낍니다. 나는 wine cmd를 시도했지만 내가 원하는 것이 아닌 Linux 명령을 전혀 해석하지 않습니다({something}이 필요합니다). 도움이 필요하세요?

Windows에서는 파일당 한 번씩 for %c in (*.*) do {something}실행됩니다 {something}(디렉토리는 무시됩니다). 현재 반복의 파일 이름 {something}을 참조할 수 있습니다 %c. 다른 수정자는 파일 경로 추출을 허용하거나 경로 없이 파일 이름, 파일 확장자, 속성, 수정 날짜/시간, 크기 등을 사용하여 for /d %c in (*.*) ...파일 대신 디렉터리를 처리합니다. 두 경우 모두 Unix 스타일 시스템 *.*과 동일하게 이름에 없는 파일이나 디렉터리를 포함하여 숨겨지지 않은 모든 파일이나 디렉터리와 일치합니다.*.

PS cmd "for"에는 bash의 한 명령에서 다루지 않을 수 있는 많은 용도가 있다는 것을 알고 있지만 위에서 언급한 명령과 동등한 것을 알고 싶습니다.

답변1

for file in *; do
  echo "$file"
done

그러나 이는 일반적으로 "숨겨진" 파일(점으로 시작하는 이름)과 일치하지 않습니다.

숨겨진 파일을 일치시키려면 이전에도 이 작업을 수행해야 했습니다.

shopt -s dotglob

디렉터리(및 아마도 "이상한" 항목)를 건너뛰려면 루프에서 해당 디렉터리를 검색해야 합니다. 패턴 일치( *)는 개체 유형에 신경 쓰지 않습니다.

for file in *; do
  test -f "$file" || continue
  echo "$file"
done

심볼릭 링크는 특별한 경우입니다. 파일에 연결되어 있지만 파일이 다른 디렉터리에 있을 수 있는 경우 고려됩니다. 심볼릭 링크를 무시합니다:

for file in *; do
  test -f "$file" || continue
  test -L "$file" && continue
  echo "$file"
done

답변2

설명하는 패턴 일치 동작은 다음과 같습니다.기술 네트워크 블로그- 오래된 버그:


*.*...또한 그 자체가 동일하다는 것을 알게 될 것입니다 .*

또한... 을 입력하면 DIR .TXT명령 프롬프트가 입력한 것처럼 동작합니다 DIR *.TXT... 이 동작은 아마도... 의도한 것은 아니지만 일부 사람들이 의존하게 된 사고입니다. Windows 95에서 버그를 수정했을 때 여러 사람이 자신의 DIR .TXT명령이 작동하지 않는다고 불평했습니다.

이것FC 바르셀로나전환 중에 일치 알고리즘이 중단되었습니다.Win32긴 파일 이름에서는 작동하지 않기 때문입니다. 긴 파일 이름에는 여러 개의 점이 포함될 수 있습니다. 물론 파일은 11자를 초과할 수 있으며 점 앞에는 8자가 넘는 문자가 올 수 있습니다. 하지만 몇 가지 특이한 점이 있습니다.FC 바르셀로나일치 알고리즘은 다음이 될 때까지 계속됩니다.Win32관용어가 되었기 때문입니다.

예를 들어 패턴이 로 끝나면 무시 .*됩니다 .*. 이 규칙이 없으면 패턴은 점이 포함된 파일만 일치하게 되며 Windows NT 3.1을 실행하는 모든 사람이 평균 작업을 하고 *.*있기 때문에 지구상의 모든 배치 파일의 90%와 모든 사람의 근육 메모리가 손상될 수 있습니다. 파일의 세계 .*.*

또 다른 예로, 점으로 끝나는 패턴은 실제로 점으로 끝나는 파일과 일치하지 않으며 확장자가 없는 파일과 일치합니다. 물음표가 점 바로 앞에 있으면 0개의 문자가 일치할 수 있습니다.


이것은 아마도 Unix 선례의 기원과 크게 다르지 않을 것입니다.가리키다다음과 같은 파일롭 파이크그의 블로그에서 가져온 메모:


오래전부터 디자이너로서유닉스파일 시스템이 개발 중이며, 탐색을 더 쉽게 하기 위해 항목 .과 모양이 만들어졌습니다. ..확실하지는 않지만 ..버전 2를 다시 작성하는 동안 파일 시스템이 계층화되었을 때(초기 구조는 매우 달랐습니다). 그러나 를 입력하면 ls이러한 파일이 나타나므로 Ken이나 Dennis는 프로그램에 간단한 테스트를 추가합니다. 당시에는 어셈블러로 작성되었지만 문제의 코드는 다음과 같습니다.

if (name[0] == '.') continue;

명령문은 예상보다 약간 짧습니다.

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;

...하지만 뭐, 쉽잖아...

나는 숨겨진 파일의 개념이 의도하지 않은 결과라고 확신합니다. 이것은 확실히 실수입니다.

(닷 파일에 어떤 목적이 있다고 반대하는 사람들에 대해 나는 그것을 부정하지는 않지만 이름의 관례가 아니라 그 목적을 제공하는 파일이라는 점을 반박합니다. $HOME/cfg또는 에서 쉽게 찾을 수 있습니다 $HOME/lib. 우리는 무슨 일이 일어났는가계획 9, 도트 파일이 없습니다. 교훈을 얻을 수 있습니다. )


그러나 그 시점부터 .도트 파일은 .표준 셸 유틸리티와 연결되기 시작했고 거기에서는 사용자별 일반 텍스트 구성 파일에만 연결되었습니다.

넌 보통 알아내지 못할 거야가리키다파일은 사용자를 제외한 어느 곳에나 배치할 수 있습니다. ~왜냐하면 그것이 실제로 의미가 있는 유일한 장소이기 때문입니다. 어쨌든 사용자는 파일 시스템의 다른 곳에 파일을 저장해서는 안 됩니다. 홈 디렉터리에 있는 파일로 작업할 때 사용자가 실수로 구성 파일의 일부 또는 전체를 삭제한 경우 불행한 일이 될 수 있습니다. 그러나 홈 디렉터리 ~나 다른 디렉터리에서 루프가 실수로 영향을 받거나 .현재 디렉터리에 있는 경우 더욱 불행한 일입니다.(더 나쁜) ..- 상위 디렉토리. POSIX는내가 말하고 싶은 것은.:


파일 이름이 마침표로 시작하는 경우 .마침표를 패턴의 첫 번째 문자로 사용하거나 슬래시 문자 바로 다음에 사용하여 /마침표를 명시적으로 일치시켜야 합니다 . 선행 기간은 다음과 일치하지 않아야 합니다.

  1. 별표 *또는 ?물음표 특수 문자

  2. 대괄호 표현식(예: ), [범위 표현식(예: ) 또는 문자 클래스 표현식(예:][!a]"[%-0]"[[:punct:]]

    • 예를 들어 대괄호 표현식 일치 목록의 명시적 마침표가 [.abc]파일 이름의 선행 마침표와 일치할 수 있는지 여부는 지정되지 않습니다.

그러나 현재 디렉터리의 모든 파일을 반복하는 것은 여전히 ​​가능합니다.가리키다파일 여부 - 루프로 충분합니다. 예를 들어:

set -- .* *
while until [ -f "$1" ] ||
            [ -z "$1" ] &&
            break "$((!$#+1))"
      do    shift;   done
do    printf %s\\n  "$1"
      shift
done

위의 명령은 현재 디렉토리 dash, bash, ksh, zsh, mksh및 의 posh모든 일반 파일을 인쇄합니다 yash. 영구 쉘 변수를 설정하지 않는다는 점에서 FOR일반적인 쉘보다 Windows 루프와 더 유사합니다 . 인수를 처리하는 것처럼 처리가 완료되면 해당 이름에는 더 이상 값이 없습니다. 일반적인 쉘에서는 in의 마지막 값이 여전히 유지됩니다.forcmd FORfor$varfor var in ...

하지만 사실은 그렇지 않아요가지다그렇게:

set -- .* * ''
while [ -n "$1" ]  || ! shift
do    [ -f "$1" ]  &&
      set -- "$@" "$1"
      shift
done
printf %s\\n "$@"

...이식적인 방식으로 동일한 목표를 달성합니다. 즉, 현재 디렉터리의 모든 일반 파일을 인쇄합니다. 하지만 먼저 인수를 한 번 반복하고 비정규 파일을 잘라냅니다. 그러나 장점은 이후에 쉘의 arg "$@"배열이 여전히 전체 목록을 보유하고 있으며 그 시점부터 다음을 수행할 수 있다는 것입니다.

for f do : something w/ "$f"; done

...동일한 어레이에서 여러 번 사용할 수 있습니다. 그러나 개수를 얻고 "$#"모든 매개변수를 단일 문자열로 연결할 수도 있으며, 각 매개변수는 정렬된 순서 "$*"로 개별적으로 처리될 수 있습니다 "$1"."${10}"

이는 일반적으로 Win32에서는 수행할 수 없는 작업입니다 cmd.

답변3

for 루프 학습에 관심이 있다면

구문 -

for i in $(command with iterable elements); do command $i; done

좋다 -

for i in $(echo 1 2 3 4 5); do echo $i; done

검색 명령에 관심이 있다면 -

find . -name "*"

깊이 수준 -

find . -maxdepth 1 -name "*"
find . -maxdepth 2 -name "*"

어쩌면 당신에게 더 유용할 수도 있습니다

관련 정보