【问题标题】:Shell script print out file names when given a folder [duplicate]给定文件夹时,Shell脚本打印出文件名[重复]
【发布时间】:2018-01-24 03:27:57
【问题描述】:

我正在编写一个 shell 脚本.. 给定一个文件夹作为命令行参数,它将打印出其中的文件/文件夹的名称

#!/bin/sh
folder="$1"
for f in "$folder"
do
  echo "$f"
done

这只会打印出给定文件夹的一些第一个文件/文件夹。

【问题讨论】:

  • Ignacio 在这里提供了一个很好的解决方案how-to-get-the-list-of-files-in-a-directory-in-a-shell-script
  • @Darrenrogers:实际上并没有。您的程序只是输出传递给脚本的第一个参数,无论它是什么。另请注意,您使用 bash 标记了您的问题 - 可能是错误的。除非您通过bash SCRIPTNAME ... 显式调用此脚本,否则它不会由bash 执行,而是由sh 执行。我建议你删除 bash 标签。

标签: bash shell scripting


【解决方案1】:

您也可以使用find 命令:

folder="$1"
find "$folder"

正如@Anubis 在 cmets 中指出的那样,find 命令默认是递归的:它还会从目标文件夹开始在子目录中搜索文件/文件夹。您可以使用 -mindepth-mindepth 选项将结果限制在当前目录中:

find "$folder" -mindepth 1 -maxdepth 1

注意,如果省略-mindepth 1,也会列出目标目录

【讨论】:

  • 是的,但这将从目标目录开始并递归到所有子目录。更好的是,这可以通过mindepthmaxdepth 进行控制。例如find "$folder" -mindepth 1 -maxdepth 1 将仅列出第一级内容等。
  • 这里需要注意的是,如果省略-mindepth 1,也会列出目标目录,heemayl给出的答案中没有产生
【解决方案2】:

$folder 之后需要shell globbing 运算符*,由目录分隔符/ 分隔:

for f in "$folder"/*
do
  echo "$f"
done

* 将扩展到$folder 内的所有文件。

顺便说一句,我看到您使用sh(不是bash)作为脚本解释器; sh 不是所有系统中的bash(例如在 Ubuntu 中),所以如果您要使用 bash(尽管在这种情况下没有任何区别),请在 Shebang 中明确使用 bash(例如 @987654333 @)。

【讨论】:

  • 因为 nullglob 选项默认关闭,如果 glob 扩展为 $folder'/*',可以添加检查 [[ -e $f ]]
猜你喜欢
  • 2015-07-13
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2014-01-06
  • 1970-01-01
  • 2014-08-03
  • 2011-06-19
相关资源
最近更新 更多