【问题标题】:Using array for `ls --ignore`对 `ls --ignore` 使用数组
【发布时间】:2020-05-31 22:50:08
【问题描述】:

我正在为我的服务器备份编写一个 bash 脚本。 基于我的网络根目录(/home),我想过滤我的网络目录,排除一些将军。 我找到了 --ignore 选项。这是我的代码,用于返回我想要的内容。

DIR_LIST=`ls -al $WWW_ROOT --ignore={.,..,ubuntu,test} | grep "^d" | awk '{ print $9 }'`
echo $DIR_LIST;

但是当我尝试使用数组时,它的效果并不好。

EXCLUDED=(. .. test ubuntu)
STR=$(IFS=,; echo "${EXCLUDED[*]}")
DIR_LIST=`ls -al $WWW_ROOT --ignore={$STR} | grep "^d" | awk '{ print $9 }'`
echo $DIR_LIST;

echo $STR 效果很好,但 echo $DIR_LIST 效果不佳。 我认为大括号不能正常工作。

如何才能如我所愿?

【问题讨论】:

    标签: arrays bash ubuntu ls


    【解决方案1】:

    您的想法大部分是正确的,但存在一些问题。首先ls 命令使用shell globbing 样式来扩展您的--ignore 模式。当您明确指定它时,它可以正常工作。

    但是当你在一个变量中定义它来扩展 glob 时,shell 不喜欢它。因为当 shell 扩展命令行时,它会先进行 glob 扩展,然后再扩展变量。由于变量中有 glob,当它扩展变量时,它已经越过了可以扩展 glob 的点,因此您的 --ignore 模式永远不会以您期望的方式真正形成。

    此外,您填充数组的方式不建议采用这种方法,因为在处理涉及空格/换行符或任何其他 shell 元字符的名称时,它很脆弱 (Why you shouldn't parse the output of ls(1))。

    在搜索文件系统时,请参阅How to exclude a directory in find . command 以排除目录。

    【讨论】:

    • 感谢您的详细解释。对我真的很有帮助。
    【解决方案2】:

    这是不使用ls 的一种方法,更糟糕的是,您使用-al 标志。

    #!/usr/bin/env bash
    
    shopt -s nullglob extglob
    
    files=(/path/to/www/directory/!(ubuntu|test)/)
    
    declare -p files
    

    这将显示数组分配中的文件。

    如果您想遍历文件并从文件名中删除路径名,而不使用 shell 的任何外部命令。

    for f in "${files[@]}"; do echo "${f##*/}"; done 
    

    使用basename时结果相同

    for f in "${files[@]}"; do var=$(basename "$f"); echo "$var"; done 
    

    或者直接在数组中做

    printf '%s\n' "${files[@]##*/}"
    

    "${files##*/}" 是 P.E. 的一种形式。参数扩展。

    有一个在线 bash 手册,您可以在其中查找 P.E.见Parameter Expansion

    或手册页。见PAGER='less +/^[[:space:]]*parameter\ expansion' man bash

    查找nullglobextglob 参见shell globbing

    名为 files 的数组现在包含您感兴趣的数据/文件。

    默认情况下不会列出点文件,因此您不必担心,除非dotglob 已启用,默认情况下是关闭的。

    【讨论】:

    • 感谢您的建议。有没有办法从结果中删除 /path/to/www/directory/ ?我的工作只需要基本目录名称。
    • 您的意思是从文件名中删除路径名?您可以使用参数扩展"${files##*/}"for f in "${files[@]}"; do echo "${f##*/}"; done
    【解决方案3】:

    如果“ubuntu”和“test”是文件,它应该可以工作。如果它们是目录,则需要添加点“。” ,如 EXCLUDED 中的 ".test" 或 ".ubuntu"

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2018-12-11
      • 2020-04-19
      • 2020-11-14
      • 2019-07-05
      • 2020-05-17
      • 2018-05-27
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多