我正在尝试创建一个脚本,该脚本可以将多个目录中具有特定扩展名的文件压缩为一个 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
中指定绝对起点,它将输出其构建的命令调用的相对路径。如下所示:find
tar
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