Linux 如何在Bash中识别多行字符串中的目录路径,替换为对自己文件内容的引用?

Linux 如何在Bash中识别多行字符串中的目录路径,替换为对自己文件内容的引用?,linux,macos,bash,shell,unix,Linux,Macos,Bash,Shell,Unix,给定一个包含以下表示*nix路径的多行字符串的bash变量: /some/app/path/dir1 /some/app/path/somefile1.txt /some/other/app/path/somefile2.txt /some/random/app/path/dir2 我希望能够识别所有目录(例如dir1和dir2),并用下面文件的路径替换这些目录路径行。最终输出中不应有目录引用,因此: #Nodirectory references, just files. /some/app

给定一个包含以下表示*nix路径的多行字符串的bash变量:

/some/app/path/dir1
/some/app/path/somefile1.txt
/some/other/app/path/somefile2.txt
/some/random/app/path/dir2
我希望能够识别所有目录(例如dir1和dir2),并用下面文件的路径替换这些目录路径行。最终输出中不应有目录引用,因此:

#Nodirectory references, just files.
/some/app/path/dir1/dir3/file1.xml
/some/app/path/dir1/dir3/file2.doc
/some/app/path/somefile1.txt
/some/other/app/path/somefile2.txt
/some/random/app/path/dir2/file3.png
/some/random/app/path/dir2/dir4/file4.txt
我不确定如何遍历这些行并删除/替换目录,我该怎么做

我假设使用'if'和各种操作符来标识目录,使用'find/my/dir-typef'来实际查找文件


我正在使用Mac OSX 10.10(约塞米蒂)。

测试名称是否为目录。如果是,请调用
find
,否则只需按原样回显即可

echo "$variable" | 
    while IFS= read -r name
    do
        if [[ -d $name ]]
        then 
            find "$name" -type f -print
        else
            echo "$name"
        fi
    done
除了管道
回显“$variable”
,您还可以使用here字符串:

while IFS= read -r name
do
    if [[ -d $name ]]
    then 
        find "$name" -type f -print
    else
        echo "$name"
    fi
done <<<"$variable"
而IFS=read-r name
做
如果[-d$name]]
然后
查找“$name”-键入f-打印
其他的
回显“$name”
fi

完成这是您试图修改的文件,对吗?不是磁盘上的实际文件吗?从目录路径到文件路径的映射是一对一的吗?你能按名称确定“目录路径”吗?按模式(最终组件中没有
)?还有其他方法吗?@EtanReisner,不,它不是一个文件,它是以前一些bash调用(实际上是diff)的结果,我将它存储在一个变量中,以便在脚本及其函数中进行进一步处理。我没有使用外部临时文件,这是一种好技术吗?@barmar,非常感谢-唯一的问题是,我需要对内存中的列表,在变量中执行此操作,如所述(????)。管道
echo“$variable”
到循环。我已经更新了答案。@barmar,我敢问,如何将输出整理回另一个单数变量?道歉,嘿,休息一下[当你做完的时候]。谢谢。
var=$(虽然…完成了,但值得指出的是,使用变量/字符串进行此操作意味着您无法正确处理名称中带有空格和换行符的路径,也可能意味着您无法正确处理名称中带有shell globs/元字符的路径。