我有一个函数,它的第一个参数是带有某个目录的存储路径的字符串。 该字符串是 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
但我更喜欢一些解决方案,我不需要改变我的工作目录
答案 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命令可以使用文件中的数据输入数据执行。