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
或与find
和IFS
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