如何在“查找”输出中仅强制相对路径?


17

我正在尝试创建一个脚本,可以将具有多个目录中某个扩展名的文件压缩为单个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

Answers:


11

如果你跑 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

代替。

请注意,pushd / popd不存在于所有shell中,因此请根据需要检查手册页。它们存在于bash中但不存在于基本sh实现中,因此在明确使用时 /bin/bash 如果脚本要求,你可以依靠它们 /bin/sh 相反(因为这可能映射到没有bash增强功能的较小的shell)


谢谢。工作出色。没有意识到linux有pushd / popd。
Shane

2
或者只是使用 cd $rootDircd - (至少在... bash )。 ( cd $rootDir ; find ... ) 也是可能的,即在子壳中做所有事情。
Daniel Beck

0

你可以使用 %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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.