检查某物是否是文件

检查某物是否是文件

我无法进行以下检查

for file in `ls -R .`
do
    if [-f $file] ......

事实是,我希望此检查在找到file.gzgzip压缩文件)并且不起作用时匹配。

答案1

也许如果您具体说明“它不起作用”的含义,我们可以更好地帮助您。

无论如何,如果你得到的输出是“[-f command not find”,那么你必须在 [ 和内部之间放置一个空格(/usr/bin/[是一个全功能命令):

if [ -f $file ] ...

但请注意,该文件可能包含空格或其他奇怪的字符,因此我建议至少在“$file”周围加上引号:

if [ -f "$file" ] ...

更好的是,不解析ls -R .而是使用find .

答案2

您不想解析ls输出。如果您想要一个文件夹下的所有文件的列表并对每个结果执行某些操作,如果您使用or并且支持and谓词(例如在 GNU、Solaris 11 或某些 BSD 系统上),.gz那么以下是更好的主意:bashzshfind-iname-print0

while IFS= read -r -d $'\0' file; do
    echo "found a .gz: $file"
done < <(find . -type f -iname "*.gz" -print0)

答案3

你有三个问题。

一个问题是你需要在[ … ]内置周围留有空格

[ -f $file ]

另一个问题是 的输出ls -R毫无用处。ls -R显示不带目录部分的文件名,因此除非对输出进行一些相对繁重的解析,否则无法使用它。递归遍历目录的正确工具是find,它有不同的语法。

第三个问题是您在变量替换周围缺少双引号。仅当您遇到包含空格或\[*?.只要您记得处理这些文件名就很简单始终在变量和命令替换周围使用双引号"$file""$(mycommand)"。有关更多信息,请参阅为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?

find . -exec sh -c '
    if [ "$0" ] …
' {} \;

请注意,您可以用于find -type f仅对常规文件执行命令(或打印输出),或者(在 Linux 上)find -xtype f还可以包含到常规文件的符号链接。

答案4

您可以find像这样使用命令:

for file in $(find . -type f -iname "*.gz")
do
  #now if is not needed
  ...
done

这将使您免于在循环内测试文件。

相关内容