在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打印的内容)但是......它不起作用。
任何建议出了什么问题?
答案 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)
您开始正确使用数组(几乎),但随后将它们放弃为空格分隔的字符串。继续使用数组。
@
- 索引数组的扩展;否则,没有理由使用@
而不是*
。-o
加入的过滤条件,以便find
将-type
视为除-exec ... +
主要文件之外的唯一条件。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 +
可以对每个调用的多个文件进行操作,而不是分别为每个文件调用一次。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
}
};
};