我正在尝试让bash检查一个目录是否存在,但只有当它符合特定的条件时才检查。
例如,我想检查以 pkg_
开头并跟随任何其他字符的目录是否存在。
因此,如果存在名为pkg_1.0
或pkg_2.0
的文件夹,bash仍将捕获它。
目前代码大致如下:
if [ -d "~/pkg_*" ];
但是每次运行它,都会返回false,无论是否存在以“pkg_”开头的任何目录。
同时,使用“cd ~/pkg_*”可以正常工作,我能够进入该目录。
shopt -s nullglob
for path in ~/pkg_*/
do
[do what you want if at least one such directory exists]
break
done
nullglob
可以确保如果不存在这样的目录,则 ~/pkg_*/
解析为空字符串,这意味着我们不会进入循环。break
停止循环,因此条件仅运行一次。示例会话:
$ cd
$ shopt -s nullglob
$ for path in ~/pkg_*/
> do
> echo 'Found one!'
> break
> done
$ mkdir 'pkg_a'
$ for path in ~/pkg_*/
> do
> echo 'Found one!'
> break
> done
Found one!
$ mkdir 'pkg_b with spaces'
$ for path in ~/pkg_*/
> do
> echo 'Found one!'
> break
> done
Found one!
这取决于您需要查找目录的位置。如果您只需要检查单个目录中是否有名为pkg_...
的目录,则可以使用for
循环,像IObO在他的答案中所示,循环遍历给定目录中的目录。
但是,如果您需要在给定目录下搜索所有子目录以查找名为pkg_...
的目录,则使用find
提供了一种方便的选项。在bash中,您可以使用进程替换将符合您条件的目录名称提供给while
循环,例如:
while read -r pkgdir; do
## do what you need with "$pkgdir"
done < <(find /path -type d -name "pkg_*")
(注意: < <
之间需要有空格)
find
命令将定位所有目录 -type d
,这些目录在 /path
下匹配 glob "pkg_*"
。这些目录将被读入变量 pkgdir
中的 while
循环中。然后,您可以按任何所需的方式处理目录中的 "$pkgdir"
。
您还可以使用 -exec
选项来执行任何所需的单个命令或调用另一个脚本以处理每个目录。您还可以将结果传输到 xargs
并完成相同的操作(建议在 find
中使用 -print0
输出 nul-terminated 目录名称,并使用 -0
选项为 xargs
指示相同)
如果您有其他问题,请告诉我。
虽然不是优雅的一行代码,但你可以尝试这个:
filelist="$HOME/pkg_*"
for f in $filelist; do
if [ -d "$f" ]; then
action_if_true
fi
done
然而,这样做的副作用是,如果您有多个匹配的文件夹,则会执行多次操作。
顺便说一句,在第一行中,我使用环境变量$HOME代替波浪号,因为波浪号无效。
我已经测试过了,它似乎也在经典的Bourne shell中有效。
Bash专家们可能有更好的答案。
你可以像这样做。
#!/bin/bash
fpath=`find ~/ -type d -name "pkg_*"` #which finds all folder start the name pkg_ in the path ~/
对每个文件夹执行单独的操作
for fnd in $fpath
do
echo "$fnd"
done
如果要在不同的路径中搜索,请根据您的需要替换~/
编辑:如果文件夹名称包含空格,请使用以下方法
#!/bin/bash
find . -type d | while read fpath; do echo $fpath; done
pkg_*
文件中也可能会出现问题。 - l0b0
bash: read: '/home/cabox/': not a valid identifier
会成为一个问题。其次,我只需要知道pkg_*
仅存在于指定的目录中。find
函数正在查找所有子目录,这会导致与其他无关但共享公共pkg_*
的文件夹出现问题。另外,为什么find
函数在done
之后?我需要在存在目录的条件下执行操作,所以我不知道如何将其应用到bash中(我是初学者,如果您看到我的github,您就会知道)。 - Find Me In The Woods-maxdepth 1
选项来限制find
命令的搜索深度(它必须是/path
后面的第一个选项)。例如:(1
表示当前/path
,2
表示/path/firstlevelsubs
等等...) - David C. Rankin