用于查找目录中的所有文件并将其连接以获取参数的命令?

时间:2010-09-22 17:09:46

标签: bash shell directory

我正在寻找一个命令,它使用特定的partern查找目录中的所有文件,让我们说“* .txt”并在BASH中创建一个参数列表。

所以如果dir包含: FILE1.TXT FILE2.TXT file3.txt nonsense.c

我需要字符串“file1.txt file2.txt file3.txt”

我知道有一个BASH / Unix命令,但我不记得了:-S。 “发现”对我不起作用......

谢谢!

Yvan Janssens

6 个答案:

答案 0 :(得分:3)

如果要对通配符匹配的文件运行命令,则不需要额外的行李:

mycommand *.txt

你记得的可能是xargs命令。它在其标准输入上获取文件名列表,并对这些文件运行命令。例如,echo *.txt | xargs mycommand是一种复杂的,不可靠的写作方式mycommand *.txtxargs必须处理的文件列表是其他命令的输出时,mycommand非常有用。

我说xargs不可靠的原因是它希望以一种特殊的方式引用它的输入:所有空格(不仅仅是换行符)都有不同的名称,反斜杠必须加倍,'"分隔文字字符串(其中只有反斜杠和结束引号是特殊的)。由于很少有命令以xargs输入格式生成输出,因此这限制了xargs对于那些知道文件名不包含任何特殊字符的罕见情况的有用性。

find命令通常与xargs结合使用,但这应该而且可以避免。写

而不是 find ... | xargs mycommand
find ... -exec mycommand {} +

答案 1 :(得分:2)

听起来你想要lsxargs

答案 2 :(得分:2)

简单的答案是

mylist=$(ls *.txt)

注意:如果没有匹配,则ls报告错误。错误可以重定向到/ dev / null。

对于除ls和find之外的命令,如果没有匹配项,则通配符用法通常会返回通配符作为结果;所以有必要处理没有匹配的特殊情况。

以下将变量“list”设置为所有.txt文件,或者如果不存在此类文件则将其设置为空字符串。超过ls(1)的优点是如果不调用外部命令。

list=$(echo *.txt)
if [ "$list" = "*.txt" ] ; then list=""; fi

运行我的命令的示例用法,但仅当列表不为空时:

test -n "$list" && my-command $list

现在,如果您的文件名称中可能包含空格,那么数组更好:

List=()
let n=0
for x in *.txt
do
    test -e "$x" || exit
    List[n++]="$x"
done

然后使用

列表
test ${#List[@]} -gt 0 && my-command "${List[@]}"

for value in "$List[@]" ; do my-command "$value" ; done 

所有这些对于ksh来说可能有点不同,但它会非常相似。

答案 3 :(得分:1)

您已经要求提供任何Unix shell的最基本功能之一。由于某种原因,它被称为“globbing”,它是内置的。

$ echo *.txt

答案 4 :(得分:0)

$ echo "*.txt"
1.txt 2.txt ...

答案 5 :(得分:0)

如果您只是在一个目录中查找文件,而不是在嵌套目录中查找文件,则可以在命令中使用glob参数,该参数将由shell解释并为每个匹配项生成一个参数文件名:

$ echo *.txt
file1.txt file2.txt file3.txt

如果您正在寻找在子目录中任意嵌套的文件,find确实是您正在寻找的。您需要传入您正在查找的目录,并将-name参数与带引号的glob表达式一起使用以查找相应的文件(如果未引用glob,则shell将尝试解释它,并替换为当前目录中与该名称匹配的文件列表(不是您想要的):

$ find . -name "*.txt"
file1.txt. file2.txt file3.txt subdir/file.txt

如果你想将这些作为参数传递给另一个函数,你可以使用$()(相当于更熟悉的反引号``),

echo $(find . -name "*.txt")

或者,如果您要获得的列表对于单个参数列表而言太长,或者需要在文件名中支持空格,则可以使用xargs,将其输入分为块,每个它足够小,可以传递给命令。

find . -name "*.txt" | xargs echo

如果您的文件名包含空格,那么xargs会将它们分成两部分,将每个部分视为一个单独的参数,这不是您想要的。您可以使用空字符0作为分隔符,-print0参数find-0参数xargs来避免这种情况。< / p>

find . -name "*.txt" -print0 | xargs -0 echo