如何让“find”返回相对路径?

如何让“find”返回相对路径?

我发现这个任务:

查找目录 ​​ 中所有文件扩展/srv/SAMPLE002名为.tar。将匹配文件名的列表(每行一个)写入 /opt/SAMPLE002/toBeCompressed.txt已创建的文件 ​。确保为每个文件指定一个相对路径,并使用/srv/SAMPLE001​​ 作为相对路径的基目录。

我在 中创建了SAMPLE001一个SAMPLE002目录srv。在 中SAMPLE002我创建了 5 个带扩展名的文件.tar。我在任务的这一部分遇到了问题:

确保为每个文件指定一个相对路径,并使用/srv/SAMPLE001​​作为相对路径的基目录。

我尝试这样做:

 find /srv/SAMPLE001/../SAMPLE002  -type f -name "*.tar"

这对我的任务来说是一个很好的解决方案吗?我的意思是:相对的每个文件的路径。也许有比我的更好的解决方案。

答案1

不,您从命令中获得的路径不是相对的。

该命令没有明确指定 的操作find,因此-print使用隐式操作。-print打印路径名。路径名由这边走

[…] 每个路径操作数都应按提供时原封不动地进行评估,包括所有尾随字符;层次结构中遇到的其他文件的所有其他文件的路径名应由当前路径操作数、如果当前路径操作数不是以 1 结尾则为 <slash> 以及相对于路径操作数的文件名的连接组成。[…]

这意味着如果您将其指定/srv/SAMPLE001/../SAMPLE002为唯一的路径操作数(起始点),那么您只能获取-print以此精确字符串开头的行。

现在检查一下相对路径名

相对路径名
不以 <slash> 字符开头的路径名。

您可以从命令中获取的任何内容都必须以/(<斜杠> 字符) 开头,因为您使用的路径操作数以 开头/。那么根据定义,这些路径名不是相对的。获取相对路径名的唯一方法find … -print是提供相对路径操作数(起点)。

对于你来说,它可能是这样的:

cd /srv/SAMPLE001 && find ../SAMPLE002 -type f -name "*.tar"

&&以防cd失败)。现在每个路径名都必须以 开头../SAMPLE002。您要查找的文件的路径.tar将以 开头../SAMPLE002/。根据定义,它们是相对的。

定义非常简洁。要知道相对性从何而来,需要知道*nix 如何解析路径.如果你知道这一点,那么你会同意

/srv/SAMPLE001/../SAMPLE002/foo.rar

会指向同一个foo.rar,无论当前工作目录是什么。但是

../SAMPLE002/foo.rar

将依赖于当前工作目录。后者路径可以不可以指向正确的foo.rar,取决于当前工作目录。这是相对的点。如果当前工作目录是,/srv/SAMPLE001那么路径将指向正确的文件。

注意,如果/srv/SAMPLE001/不存在或/srv/SAMPLE001/..不存在(例如,SAMPLE001是常规文件),则/srv/SAMPLE001/../SAMPLE002/foo.rar无法解析。这是/srv/SAMPLE001本例中唯一的依赖项。但是,依赖项不会生成/srv/SAMPLE001/../SAMPLE002/foo.rar相对路径。


/opt/SAMPLE002/toBeCompressed.txt您的原始命令根本没有写入。使用适当的操作符重定向输出find。例如:

cd /srv/SAMPLE001 && find ../SAMPLE002 -type f -name "*.tar" >/opt/SAMPLE002/toBeCompressed.txt

答案2

请使用以下命令,

查找 /srv/SAMPLE002 -type f -name "*.tar" -fprintf /opt/SAMPLE002/toBeCompressed.txt "%P \n"

相关内容