Jac*_*ack 4 osx scripting terminal shell-script
好的,在立即将其作为副本关闭之前,让我解释一下。我尝试了很多方法,例如:
for d in /Applications ; do
echo "$d"
done
Run Code Online (Sandbox Code Playgroud)
但那又回来了
/应用
而不是 /Applications 的内容。
我也试过:
#!/bin/bash
FILES=/Applications
for file in $FILES
do
echo $file
done
Run Code Online (Sandbox Code Playgroud)
这基本上是一样的。不过,我注意到,当我这样做时:
#!/bin/bash
for file in *
do
echo $file
done
Run Code Online (Sandbox Code Playgroud)
它正确地回显了我的主文件夹中的所有文件夹。有谁知道这是怎么回事?
要遍历目录中的文件(和子目录),您可以使用
for file in /Applications/*
do
echo "$file"
done
Run Code Online (Sandbox Code Playgroud)
请注意,如果未找到匹配项,file变量将包含/Applications/*字面上的字符串(带有星号),如果以下命令需要现有路径,则这可能会导致错误。如果没有文件匹配,你什么都不做,你可以使用这个nullglob选项:
shopt -s nullglob
for file in /Applications/*
do
echo "$file"
done
Run Code Online (Sandbox Code Playgroud)
在*被称为壳通配符(路径扩展),运营商(?和[]太),当你调用它不带引号的,它会扩大到所有在当前目录下的文件(无任何目录前缀)。如果您使用前缀 eg /foo/*,它将被扩展到目录中的所有文件/foo。
请注意,它也用于匹配某些文件,例如仅匹配以当前目录开头foo和结尾bar的文件,请使用 glob 模式:
foo*bar
Run Code Online (Sandbox Code Playgroud)
因此,for循环现在可以采用以下形式:
for f in foo*bar; do echo "$f"; done
Run Code Online (Sandbox Code Playgroud)
阅读manshell 页面以获取有关 shell globbing 的更多信息。
正如Jeff Schaller所指出的,*通常的工作方式是ls- 它不会显示名称以.(句点)开头的内容。如果你使用bash,你想要得到的东西的名字开始.,
小号等(打开)SH ELL选择离子dotglob与命令
shopt -s dotglob
Run Code Online (Sandbox Code Playgroud)
这将导致*工作ls -A- 它仍然不会显示.和..他们自己,但会显示以..
您的问题提到“目录中的所有内容”。这是一个有点模棱两可的短语。如果您的意思是(顶级)/Applications目录中的所有内容,那么其他答案都可以。但是,如果您想要/Applications 树中的所有内容
(即/Applications目录及其子目录中的所有内容),并且您使用的是 bash,请globstar使用以下命令设置 shell 选项
shopt -s globstar
Run Code Online (Sandbox Code Playgroud)
这将导致** 作为文件名组件意味着这里和下面的所有内容。所以
for file in /Applications/**
do
echo "$file"
done
Run Code Online (Sandbox Code Playgroud)
将列出/Applications 树中的所有对象(文件、目录等)。
请注意,这不能与同一组件级别的其他字符组合;即,你不能做这样的事情foo**bar。但是,您在**. 例如,
for file in /Applications/**/README
Run Code Online (Sandbox Code Playgroud)
通过名为所有文件将循环README在/Applications树,
for file in /Applications/**/*.txt
Run Code Online (Sandbox Code Playgroud)
将查找名称以.txt.
您可以一次设置多个选项;例如,与
shopt -s dotglob globstar
Run Code Online (Sandbox Code Playgroud)
有关完整的选项列表,请参阅 bash 文档。您可以ü NSET的选项shopt -u。
"$file"),除非您有充分的理由不这样做,并且您确定自己知道自己在做什么。