해결책:

해결책:

다음 줄은 모두 내 디렉터리 중 하나에 대한 디렉터리 목록을 반환합니다.

첫 번째는 이름 패턴을 사용하며 디렉터리가 실제로 디렉터리이므로 디렉터리를 선택한 다음 루프에서 처리해야 합니다. 따라서 나는 두 번째 것을 사용하고 싶습니다.

ls -l  | awk '{print $9}' | grep 'dirsPrefix*'

find . -maxdepth 1 -type d | grep -v \\.$ | awk -F'./' '{print $2}'

하지만 ksh for 루프에서는 첫 번째 루프가 두 번째 루프와 다르게 작동합니다. 왜일까요? :

(해결책:

for dir in `find . -maxdepth 1 -type d -exec echo "{}" \; | awk -F'/' {print $2}`
do 
  echo "dir: $dir"
done

작동합니다)

이것은 또한 작동합니다:

for dir in `ls -l  | awk '{print $9}' | grep 'dirsPrefix*'`
do 
  echo "dir: $dir"
done

하지만 다음은 그렇지 않습니다.

for dir in `find . -maxdepth 1 -type d | grep -v \\.$ | awk -F'./' '{print $2}'`
do 
  echo "dir: $dir"
done

답변1

현재 디렉터리에서 디렉터리를 가져오려고 너무 열심히 노력하고 있습니다. 당신이 해야 할 일은 다음과 같습니다:

for dir in */; do echo "dir: $dir"; done
# .........^^

배열에 저장하려면 다음을 수행하십시오.

dirs=( */ )

답변2

다음과 같이 변경하세요.

for dir in $(find . -maxdepth 1 -type d | grep -v \\.$ | awk -F'./' '{print $2}')
do 
  echo "dir: $dir"
done

왜 작동하는지 설명할 수는 없지만 항상 백틱을 사용해야 한다는 것은 알고 있습니다 $().

답변3

실행 중인 명령을 알고 있어야 합니다.

for dir in `find . -maxdepth 1 -type d | grep -v \\.$ | awk -F'./' '{print $2}'`

인용 해석에는 두 가지 수준이 있습니다. 첫 번째 수준인 명령이 실행되는 명령줄 수준에서 백틱 "...." 아래의 텍스트는 큰따옴표 보간과 마찬가지로 먼저 백슬래시 및 $ 변수를 검색합니다. 그것이 $외로움의 끝이니까 확장되지는 않을 것이다. 그래도 도망가서 나쁠 건 없잖아요.

그래서 이건 떠날 거야grep -v \\.$ ----> grep -v \.$

이제 이 단계가 끝났으므로 실행할 서브셸에 넘겨야 합니다. 이 서브셸에서는 명령이 구문 분석되고 grep -v \.$백슬래시가 제거되므로 grep이 단계가 끝나면 실행 파일은 다음과 같이 끝납니다. grep -v .$

이제 비어 있지 않은 모든 줄은 이 패턴과 일치하며 파일 이름이 비어 있지 않을 수 없기 때문에 생성된 비어 있지 않은 줄을 모두 찾습니다.

따라서 이는 모든 출력이 선택된다는 의미 find이며, 반대로 find 출력을 선택해서는 안 된다는 의미입니다. 그래서 awk는 옷을 차려입었지만 실제로는 갈 곳이 없습니다.

해결책:

이 문제를 해결하기 위해 할 수 있는 일이 많이 있습니다.

  • grep에 백슬래시를 하나 더 추가하면 다음과 같이 됩니다. grep -v \\\.$ 이 시나리오에서 견적 확장의 각 단계에서 발생하는 상황을 기반으로 이 수정 사항이 작동한다고 확신합니다.
  • $() 형식의 명령 보간을 사용합니다. 이 형식에서는 `` 형식의 역따옴표와 달리 참조가 $()로 다시 시작되기 때문입니다.
  • 다음과 같이 grep에 작은따옴표를 사용하십시오.grep -v '\.$'
  • 탈출하려면 문자 클래스를 사용하십시오. grep -v '[.]$'
  • find명령 자체에서 모든 작업을 수행합니다.

find . -maxdepth 1 -type d ! -name . -exec sh -c '
   for d do printf "dir: %s\n" "${d:2}"; done
' sh {} +

답변4

표현에 문제가 있습니다 grep. 로 끝나는 모든 디렉토리 이름과 일치 .하지만 어떤 방식으로든 출력을 왜곡하여 for혼란을 야기하는 것으로 보입니다. 이에 대해 할 수 있는 일은 많습니다.

  • grep 표현식을 다음으로 변경하는 것이 grep -v "^\.$"더 정확할 수 있으며(디렉토리만 일치하므로 ) -loop .에서 for작동 합니다.

  • $(..)@Jesse_b가 이미 지적했듯이 여러 가지 이유로 표현식을 사용하는 것이 더 좋습니다 . 이렇게 하면 즉각적인 문제가 해결되지만 근본적인 오류는 해결되지 않습니다.

  • find이 스크립트를 조금 더 간단하게 만들기 위해 모든 방법을 사용할 수 있습니다 .

    for dir in `find . -maxdepth 1 -type d ! -name "." -printf "%f "`
    do
       echo $dir
    done
    

이름에 공백( )이 있는 디렉터리가 있는 경우 이러한 솔루션은 모두 문제 없이 작동합니다.

관련 정보