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はほとんどすべての理由をリストします。そして..リストにありません。

編集:上記は彼の2番目の質問についてです。彼は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

関連情報