「検索」出力で相対パスのみを強制するにはどうすればよいですか?


25

いくつかのディレクトリにある特定の拡張子を持つファイルを単一のtarボールに圧縮できるスクリプトを作成しようとしています。現在、スクリプトファイルには次のものがあります。

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

回答:


12

find目的のルートディレクトリから実行し、findオプションで絶対開始点を指定しない場合、tar構築するコマンド呼び出しへの相対パスを出力します。そのようです:

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

現在の作業ディレクトリを永久に変更したくなくbash、シェルを使用している、またはシェルに似ている場合は、実行できます

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

代わりに。

pushd / popdはすべてのシェルに存在するわけではないため、必要に応じてmanページを確認してください。これらはbashに存在しますが、ベースのsh実装には存在しないため、明示的に使用し/bin/bashている間は、スクリプトが/bin/sh代わりに要求する場合は信頼できません(bashの拡張機能がない小さなシェルにマップされる可能性があるため)


ありがとう。見事に働いた。Linuxがpushd / popdしていたことに気づかなかった。
シェーン

3
または、単にcd $rootDirand cd - (少なくともbash)を使用します。( cd $rootDir ; find ... )サブシェルですべてを実行することも可能です。
ダニエルベック

9

ディレクティブで%Pフォーマットを使用できます-printf

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

あなたの例に表示されます:

subdir/test.doc
second.doc

次に、次のようにexecコマンドを実行するためfindに、for式でこのリストを使用できます。

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

1
受け入れられたソリューションは機能しますが、基本的にはハックです。私見これは質問に対する正しい解決策でなければなりません。
ナルコレッシコ

Narcolessicoに感謝します。MHOでもあります:-)
Gabriel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.