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

是否有一个 shell 选项可以隐藏dotted folders?我ls -a也面临这个问题。

答案1

这是使用 bash 的方法extglob

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

Withextglob模式!(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

相关内容