我正在寻找一个命令,它使用特定的partern查找目录中的所有文件,让我们说“* .txt”并在BASH中创建一个参数列表。
所以如果dir包含: FILE1.TXT FILE2.TXT file3.txt nonsense.c
我需要字符串“file1.txt file2.txt file3.txt”
我知道有一个BASH / Unix命令,但我不记得了:-S。 “发现”对我不起作用......
谢谢!
Yvan Janssens
答案 0 :(得分:3)
如果要对通配符匹配的文件运行命令,则不需要额外的行李:
mycommand *.txt
你记得的可能是xargs
命令。它在其标准输入上获取文件名列表,并对这些文件运行命令。例如,echo *.txt | xargs mycommand
是一种复杂的,不可靠的写作方式mycommand *.txt
。 xargs
必须处理的文件列表是其他命令的输出时,mycommand
非常有用。
我说xargs
不可靠的原因是它希望以一种特殊的方式引用它的输入:所有空格(不仅仅是换行符)都有不同的名称,反斜杠必须加倍,'
和"
分隔文字字符串(其中只有反斜杠和结束引号是特殊的)。由于很少有命令以xargs
输入格式生成输出,因此这限制了xargs
对于那些知道文件名不包含任何特殊字符的罕见情况的有用性。
find
命令通常与xargs
结合使用,但这应该而且可以避免。写
find ... | xargs mycommand
find ... -exec mycommand {} +
答案 1 :(得分:2)
答案 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