列出文件夹,但如果文件夹与Bash中的列表匹配则排除

时间:2018-02-05 22:20:53

标签: linux bash

第一次玩BASH并且有点卡住了。

此脚本将列出所有文件夹,但我想将其修改为在可能的情况下不列出某个文件夹...

工作:

_list_banners () {
  for f in * ; do [ -d "$f" ] && echo ${_handle_banner_type}${_handle_message} $f ; done
}

哪个有效并列出文件夹,但我想从列表中排除例如文件夹MASTER

尝试:

_list_banners () {
  for f in * ;
    if [ $f != "MASTER" ]; then
      do [ -d "$f" ] && echo ${_handle_banner_type}${_handle_message} $f
    fi
  ; done
}

但是当我运行它时,我得到以下错误而不是我的文件列表:

$ bash myscript
myscript: line 3: syntax error near unexpected token `if'
myscript: line 3: `    if [ $f != "MASTER" ]; then'

2 个答案:

答案 0 :(得分:0)

if是for循环的一部分,不应移到_list_banners () { for f in * ; do if [ "$f" != "MASTER" ]; then [ -d "$f" ] && echo "${_handle_banner_type}${_handle_message} $f" fi done } 块内:

name

答案 1 :(得分:0)

您可以将目录检查和排除项移动到您的glob中(需​​要shopt -s extglob,而shopt -s nullglob最好避免在没有匹配时出现意外行为):

shopt -s extglob
shopt -s nullglob

_list_banners () {
    for f in !(MASTER)/; do 
        echo "${_handle_banner_type}${_handle_message} $f"
    done
}

!(MASTER)是一个排除MASTER的glob,而附加/只返回目录。

如果您只想要没有尾部斜杠的目录名称,则可以在${f%/}行使用$f而不只是echo