Sh:将文件夹中的所有文件添加到数组

时间:2015-06-24 07:52:37

标签: unix sh

我正在尝试使用数组来存储名称不包含单词“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*'`

但我需要一个数组而不是一个变量。

2 个答案:

答案 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*