我有许多目录想要输入,并且都以相同的字符串"example"开头。除此之外,在同一位置,还有其他我不想输入的目录。我习惯于以这种方式循环:
for dir1 in */
以前具有其他名称的其他目录存在于同一位置,但现在我不能了。我尝试使用以下方法改变命令:
for dir1 in "example"*/
或 例如,对于 dir1*/ 光盘"目录1"
但它不会进入目录。它说:line 8: cd: example*//: file or directory does not exist
。我该怎么做?
shell 扩展通配符
for dir1 in */
进入通配符匹配列表;
for dir1 in ack/ bar/ foo/ nst/ pth/ quux/
如果要从此列表中排除foo
和bar
,最简单的解释是启用扩展通配,假设您有 Bash;
shopt -s extglob
for dir1 in !(foo|bar)*/
但是任何排除您不想匹配通配符的文件的技巧都是可以的。 在这种特殊情况下,您可以做
for dir1 in [!bf]*/
但在悲观的情况下,您只需要分解并列出您想要匹配的目录。 或者也许只是单独绕过不需要的:
for dir1 in */; do
case $dir1 in bar|foo) continue ;; esac
: ... your code here
done
如果您确实想遍历名称以 example
开头而没有其他名称的所有目录,那么这样做的方法当然是
for dir1 in example*/
您收到的错误消息似乎表明没有具有此名称的目录。
你可以用一行bash
试试这个,
for dir in example*; do if [ -d $dir ];then cd $dir; pwd; echo $dir; fi; done
巴什脚本,
#!/bin/bash
for dir in example*
do
if [ -d $dir ];then
cd $dir;
pwd;
echo $dir;
fi
done
Bash 文件名通配是一件很光滑的事情。改用查找可能更方便。喜欢这个:
for dir in `find /cygdrive/c/workspaces/ -name '*log*' -a -type d`; do echo $dir; done
"-类型 d"仅适用于目录。