我正在尝试使用数组来存储名称不包含单词“silent”的文件夹中的所有.txt
个文件。到目前为止,我尝试了以下命令,但没有成功:
ACTIVE_LOGS=($(`find $DEST_DIR -name '*.txt' '!' -name '*silent*'`))
ACTIVE_LOGS=($("find $DEST_DIR -name '*.txt' '!' -name '*silent*'"))
我必须提到以下命令按预期工作:
ACTIVE_LOGS=`find $DEST_DIR -name '*.txt' '!' -name '*silent*'`
但我需要一个数组而不是一个变量。
答案 0 :(得分:0)
将数组声明为shell变量可能需要,根据您使用的shell,初始值由空格(或标签,我认为)分隔。但find(1)
打印出由换行符分隔的搜索结果。使用-printf
代替-print
会得到您所追求的结果:
ACTIVE_LOGS=($(find $DEST_DIR -name '*.txt' '!' -name '*silent*' -printf "%f "))
后引号也是多余的,因为$()
已生成子shell。
使用Bash数组可以按预期工作,即使没有摆弄新行:
ACTIVE_LOGS=($(find $DEST_DIR -name '*.txt' '!' -name '*silent*'))
答案 1 :(得分:0)
在这两种情况下,您都在命令替换中添加了额外的引用层;只需删除它们。
ACTIVE_LOGS=($(find "$DEST_DIR" -name '*.txt' '!' -name '*silent*'))
在bash
(和其他shell;语法可能不同)中,您可以完全省略find
。
shopt -s globstar nullglob extglob
ACTIVE_LOGS=( "$DESTDIR"/**/!(*silent*).txt )
globstar
允许您使用**
匹配零个或多个目录;如果没有匹配,nullglob
会导致模式消失,而不是字面上对待; extglob
允许您使用!(*silent*)
来匹配任何但模式*silent*
。