我发现这个任务:
查找目录 中所有文件扩展
/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"