나는 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는내가 말하고 싶은 것은.
:
파일 이름이 마침표로 시작하는 경우 .
마침표를 패턴의 첫 번째 문자로 사용하거나 슬래시 문자 바로 다음에 사용하여 /
마침표를 명시적으로 일치시켜야 합니다 . 선행 기간은 다음과 일치하지 않아야 합니다.
별표
*
또는?
물음표 특수 문자대괄호 표현식(예: ),
[
범위 표현식(예: ) 또는 문자 클래스 표현식(예:]
[!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의 마지막 값이 여전히 유지됩니다.for
cmd
FOR
for
$var
for 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 "*"
어쩌면 당신에게 더 유용할 수도 있습니다