如何在bash中使用变量的内容来传递在脚本中查找?

时间:2016-12-21 10:36:24

标签: linux string bash find quotes

在bash脚本中,我试图使用变量的内容作为find命令的选项:

#!/bin/bash
FILE_EXTENSIONS=( txt png jpg )

FIRST=1
for FILE_EXTENSION in ${FILE_EXTENSIONS[@]} 
do
#   echo "$FILE_EXTENSION"
    if [[ $FIRST == 1 ]]
    then
        FIND_FILTER="-iname '*.$FILE_EXTENSION'"
        FIRST=0
    else
        FIND_FILTER="${FIND_FILTER} -o -iname '*.$FILE_EXTENSION'"
    fi
done
# Read and write only for user and group, ignore case '-iname'
#find . -type f "$FIND_FILTER" -exec chmod 660 {} \;
echo Find filter: $FIND_FILTER
# This might work with some already provided suggestions:
find . -type f $FIND_FILTER
# But this fails so far
find . -type f $FIND_FILTER -exec chmod 660 {} \;        
#EOF

目的是设置适当的访问权限,因为有些文件(例如图片或办公文档)被标记为可执行文件。

所以实际上上面的脚本有几个连接了文件扩展名的数组,但脚本显示了问题。

第一种方法是迭代最终数组并每次调用find。但从运行时的角度来看,每次反复搜索都是愚蠢的。

我也可以在python中简单地做到这一点,但有一次我认为我想用bash中的linux基本方法来解决它。

看起来FIND_FILTER变量的内容是正确的(至少是用echo打印的内容)但是......它不起作用。

任何建议出了什么问题?

2 个答案:

答案 0 :(得分:0)

好的,我找到了它无效的原因

$ find . $FIND_ARGS &       # Does not work
[1] 6312    
$ cat /proc/6312/cmdline
find . -iname '*.png'

$ find . -iname '*.png' &   # Works
[1] 8901
$ cat /proc/8901/cmdline
find . -iname *.png

因此,直接调用命令时的引号仅用于bash不扩展参数。当您间接启动命令时,您必须删除这些引号。

答案 1 :(得分:0)

您开始正确使用数组(几乎),但随后将它们放弃为空格分隔的字符串。继续使用数组。

  1. 始终引用@ - 索引数组的扩展;否则,没有理由使用@而不是*
  2. 作为一般规则,避免使用全大写变量名称;它们(大多数)保留供shell使用。
  3. 在转义括号中附加-o加入的过滤条件,以便find-type视为除-exec ... +主要文件之外的唯一条件。
  4. 使用chmod,以便#!/bin/bash file_extensions=( txt png jpg ) first=1 for ext in "${file_extensions[@]}" do # echo "$ext" if [[ $first == 1 ]] then find_filter=(-iname "*.$ext") first=0 else find_filter+=( -o -iname "*.$ext") fi done # Read and write only for user and group, ignore case '-iname' find . -type f \( "${find_filter[@]}" \) -exec chmod 660 + 可以对每个调用的多个文件进行操作,而不是分别为每个文件调用一次。
  5. angular
        .module('app.myModule')
        .factory('myFactory', myFactory);
    
    myFactory.$inject = [];
    
    function myFactory() {
    
        var factory = {
            func1: func1,
            func2: func2
        };
    
        return factory;
    
        //////////
    
        function func1() {
            if (/* some condition */) {
                return true;
            } else {
                return false;
            }
        };
    
        function func2() {
            if (func1()) {
                // do something
            } else {
                // do something else
            }
        };
    
    };