【发布时间】:2012-02-15 15:45:34
【问题描述】:
我需要从要在我的 UNIX 系统上处理的文件的目录中获取文件名。目录中只有一个文件,并且其名称会动态更改(通过一种未命名的外部方法)。
请告诉我如何做到这一点。
【问题讨论】:
我需要从要在我的 UNIX 系统上处理的文件的目录中获取文件名。目录中只有一个文件,并且其名称会动态更改(通过一种未命名的外部方法)。
请告诉我如何做到这一点。
【问题讨论】:
如果只有一个文件名不是以. 开头,那么:
filename="$(ls $directory)"
这会捕获ls 的输出。由于“一个文件”的限制,即使名称包含换行符、空格、制表符或其他任何内容,它也是安全的。有多个文件,解析ls的输出是有问题的。
如果你想要路径名,而不仅仅是文件名,你可以使用:
filename=$directory/*
同样,这只是因为“一个文件”的限制才安全。无法使用它来区分“目录中有一个文件,其名称为*”和错误情况“目录中根本没有文件”。使用ls,如果字符串为空,则没有文件。
如果文件名可能以.开头,那么生活就困难了很多;你可能会使用:
filename=$(cd $directory; basename "$(find . -type f)")
再一次,这只是因为“一个文件”的限制是安全的。如果可能有多个文件,则需要完全使用其他技术。
【讨论】:
filename="$(cd $directory && ls -1a | tail -1)" 将为任何给定的文件名获取$directory 中的一个文件名,无论它是否以句点开头。 ls 的 -1 选项为每行提供一个文件名。 (如果有人将换行符放入文件名,他们应该有由此产生的问题)
for fn in *
do
filename="$fn"
done
【讨论】: