我怎样才能强制“查找”输出中仅使用相对路径?

我怎样才能强制“查找”输出中仅使用相对路径?

我正在尝试创建一个脚本,该脚本可以将多个目录中具有特定扩展名的文件压缩为一个 tar-ball。目前我在脚本文件中的内容是:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

$rootDir搜索的基本路径在哪里。

这很好,只是 tar 文件中的路径是绝对的。我更希望路径是相对于的$rootDir。我该怎么做呢?

tar -tf docs.tar输出电流的$rootDir示例/home/username/test

home/username/test/subdir/test.doc
home/username/test/second.doc

我希望输出的是:

./subdir/test.doc
./second.doc

答案1

如果您从所需的根目录运行并且未在选项find中指定绝对起点,它将输出其构建的命令调用的相对路径。如下所示:findtar

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

如果你不想永久更改当前工作目录并且使用bash或类似作为你的 shell,你可以这样做

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

反而。

请注意,并非所有 shell 都提供 pushd/popd,因此请根据需要查看手册页。它们存在于 bash 中,但不存在于基本 sh 实现中,因此虽然/bin/bash您可以明确使用它们,但如果脚本要求使用它们,则您不能依赖它们/bin/sh(因为这可能会映射到没有 bash 增强功能的较小 shell)

答案2

您可以%P-printf指令中使用以下格式:

find ${rootDir} -name '*.doc' -printf "%P\n"

将显示在您的示例中:

subdir/test.doc
second.doc

然后,您可以在表达式中使用此find列表for来运行我们的 exec 命令,如下所示:

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

相关内容