【问题标题】:AIX: Find Files with name containing specific string and add those to a listAIX:查找名称包含特定字符串的文件并将其添加到列表中
【发布时间】:2019-04-28 13:32:44
【问题描述】:

我们需要在目录中查找名称包含特定字符串的文件并将它们添加到列表中。

假设我们在包含字符串ABC的特定目录中创建包含文件名的列表。

试过这个:

file_list=()
str="ABC"
while IFS= read -d $'\0' -r file ; do
file_list=("${file_list[@]}" "$file")
done < <(find . -name "*$str*" -print0)
echo "Files getting appended: ${file_list[@]}"

如果目录包含文件:

ABC.txt, ABCD.txt, XYZ.txt, WXYZ.txt

那么上述sn-p的预期输出应该是:

Files getting appended: ABC.txt ABCD.txt

在 AIX 中获取错误消息:

find: 0652-017 -print0 is not a valid option.

有一篇适用于 Linux 的相关帖子,但在 AIX 中没有运气。

任何帮助都会得到真正的赞赏!

【问题讨论】:

    标签: list find filenames string-matching aix


    【解决方案1】:

    确实,AIX!find 不支持-print0。试试这样的:

    #!/usr/local/bin/bash
    
    file_list=()
    
    touch xABCy
    touch 'x ABC y'
    
    str="ABC"
    
    while IFS='\n' read -r file ; do
        file_list+=("$file")
    done < <(find . -name "*$str*")
    
    for i in "${file_list[@]}"; do
        printf '\"%s\"\n' "$i"
    done
    

    结果:

    "./x ABC y"
    "./xABCy"
    

    【讨论】:

    • 将结果收集到一个散列中以便循环遍历散列有点有趣。只需在第一个循环中打印,不要收集值。
    • 当然,第二个循环仅用于调试:它证明文件名和空格被正确处理。实际的脚本应该使用file_list 做一些实际的工作
    • 我指出这一点是因为不必要地将事物收集到变量中是一种常见的反模式。如果你不需要随机访问(回去看看你收集了多少,比较文件名 m*n,跳过两个等)你不想要或不需要一个数组。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2016-01-28
    • 2020-06-04
    • 2017-01-17
    • 2015-01-31
    相关资源
    最近更新 更多