列出路径中的文件

时间:2012-03-03 18:30:46

标签: bash path

我有一个函数,它的第一个参数是带有某个目录的存储路径的字符串。 该字符串是 find的输出。 -type d

如果我列出当前目录中的所有文件,则简单

for file in *; do
  commands
done

但是对于字符串,它当然不会那样对待它。

for file in "$1"; do
  commands
done  

所以我想用 ls

for file in `ls "$1"`; do
  commands
done`

但是使用这个解决方案之后,根本无法处理带空格的文件 研究我发现在任何地方都有建议使用查找,但我没有得到,发现会 列出所有文件/目录/子目录,只是整个树,但我只想要当前目录中的东西。 我将非常感谢你的每一次帮助。

更新

我尝试了另外一件似乎有用的事情:

pushd "$1"
for file in *; do
    echo "$file"
done
popd 

但我更喜欢一些解决方案,我不需要改变我的工作目录

5 个答案:

答案 0 :(得分:3)

如果您只想要非点文件,以下应该可以解决问题。

for file in "$1"/*; do
  commands
done  

以下代码更灵活。

while IFS= read -r -d $'\0' result; do
    commands
done < <( find -P "$1" -printf %p"\0" )

答案 1 :(得分:1)

echo "$str" | while read file ; do echo $file; done

答案 2 :(得分:0)

我相信你读过的建议是使用find的-exec功能。您可以传递命令以查找将为每个找到的文件执行的命令。

$ find . -type d -exec stat {} \;

首先,请注意字符{}将替换为文件名,您需要转义分号\;

此外,这是另一种常见的Bash习语,它可以帮助您处理文件中的空格:

$ find . -type d | 
while read line; do
    # commands with $line
done;

答案 3 :(得分:0)

如果你可以管理它,这可能是有效的:

(
cd "$1" || exit 1
for file in *
do
    commands
done
)

括号在子shell中运行内容。子shell将目录更改为指定目录;然后shell的globbing处理文件名,包括带空格的文件名。主要的警告是,如果您执行的命令的名称相对于shell启动的当前目录,cd操作会破坏所有内容。我的建议是“不要执行不在你的PATH上的命令”,在这种情况下,这不会是一个问题。

否则,请查看bash的数组和元字符扩展到数组中。他们可以处理这项任务。

请注意,通常与find ... -print0结合的xargs -0可以提供帮助。

你也可以考虑:

find "$1" -type f -maxdepth 1 -exec command {} +

这提供了文件名作为command的正确参数,+符号表示“在命令行上方便地匹配的文件名”。当没有找到文件时,这有xargs没有执行命令的额外优点,并且标准xargs的令人恼火的设计(错误)功能(GNU xargs有一个选项可以覆盖当然是标准行为。

答案 4 :(得分:0)

已有权利答案,这更像是奖金。当我遇到这个问题时,我通过'find'打印文件名并将它们保存到文件中来解决它。之后,我逐行从文件中提取文件名。此外,许多shell命令可以使用文件中的数据输入数据执行。