如何不进行递归


19

我正在尝试使用目录中的模式ls一些文件。我只想扫描第一个级别而不递归。

我的剧本:

for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*)
do
  echo $i;
done

以上命令以递归方式扫描。如何仅扫描第一级目录?


printf %s\\n "$INCOMINGDIR/"*"$BUSINESSDATE"*
mikeserv

Answers:


39

不要解析ls。也不要使用ALL_CAPS_VARS

for i in "$incoming_dir"/*"$business_date"*; do

以交互方式,ls具有一个-d防止进入子目录的选项:

ls -d $INCOMINGDIR/*$BUSSINESSDATE*

感谢您提供的信息,我现在开始以新行名称创建文件,只是为了烦恼sysadmins。
Petah

这就是智能sysadmin / programmer使用的原因"${i}"。你永远不会知道里面可能有什么i
Ricky Beam

@Petah:或有恶意的人可以创建一个名为的文件,my_file.doc[newline]another_persons_file.doc并希望某些脚本可以尝试“ rm”它所看到的2个文件名... Glenn的链接是必读的(在mywiki.wooledge.org上,每个人都应该阅读整个常见问题解答以及陷阱页面)
Olivier Dulac

1
凉。我不知道-d选项!
dokaspar

大!这也适用于简单的事情。如列出所有以点为前缀的文件:ls -d .*
Wassadamo

8

没有理由为什么此命令是递归的。但是,如果$INCOMINGDIR/*$BUSSINESSDATE*与目录匹配,则会显示该目录的内容,而不是目录本身。但是没有超出此级别的递归。

使用此命令可避免这种影响:

ls -d "$INCOMINGDIR/"*"$BUSSINESSDATE"*

for ... inls输出的命令有风险。

一般来说,find似乎是更好的解决方案,或者

for i in "$INCOMINGDIR/"*"$BUSSINESSDATE"*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.