題 如何在“查找”輸出中僅強制相對路徑?


我正在嘗試創建一個腳本,可以將具有多個目錄中某個擴展名的文件壓縮為單個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

17
2017-11-12 09:12


起源




答案:


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


11
2017-11-12 09:29



謝謝。工作出色。沒有意識到linux有pushd / popd。 - Shane
或者只是使用 cd $rootDir 和 cd -  (至少在... bash)。 ( cd $rootDir ; find ... ) 也是可能的,即在子殼中做所有事情。 - Daniel Beck♦


你可以使用 %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

0
2018-05-23 15:55