bash의 for 루프에는 도트 및 이중 도트 폴더가 나열됩니다.

bash의 for 루프에는 도트 및 이중 도트 폴더가 나열됩니다.
for f in ~/common/.*; do
    echo $f
done

나열된 항목은,

/home/sk/common/.           #undesired
/home/sk/common/..          #undesired
/home/sk/common/.aliasrc

처리를 건너뛰고 이를 방지하기 위해 추악한 해킹을 사용하고 .있습니다 ...

if [[ $f  == '/home/sk/common/.' || $f  == '/home/sk/common/..' ]]; then
  true 
else
  --do the ops
fi

숨길 수 있는 쉘 옵션이 있습니까 dotted folders? 저도 ls -a이 문제에 직면하고 있습니다.

답변1

bash를 사용하여 수행하는 방법은 다음과 같습니다 extglob.

shopt -s extglob
for f in .!(|.); do
  echo "$f"
done

패턴 extglob!(pattern-list)주어진 패턴을 제외한 모든 항목과 일치합니다. 예제의 패턴은 .로 시작하고 뒤에 아무것도 또는 다른 단일이 나오지 않는 모든 항목 과 일치함을 의미합니다 ..

답변2

그런 뜻 이었습니까:

ls -A

당신은 또한 사용할 수 있습니다

ls -Al

. 및 .. 은 나열되지 않습니다(대문자 A가 이를 수행함). a는 모든 이유를 나열하고, A는 거의 모든 이유를 나열합니다. 그리고..목록에 없습니다.

편집: 위의 내용은 그의 두 번째 질문에 대한 것입니다. 그는 ls -a와 동일한 문제가 있다고 말했습니다.

답변3

사용find

find ~/common -type f -name ".*" -print0 | \
    while read -d $'\0' file; do \
        echo $file; \
    done

또는 findIFS

find ~/common -type f -name ".*" -print0 | \
    while IFS= read -rd '' file; \
        do echo $file; \
    done

답변4

이를 수행하는 이식 가능한 방법은 case선언을 사용하는 것입니다. 전역을 약간 잘라내는 것도 문제가 되지 않습니다.

for f in ~/common/.?*; do
    case $f in (*/..)  ;; (*)
    : do something w/ "$f"
    esac
done

관련 정보