web-dev-qa-db-ja.com

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

複数のディレクトリにある特定の拡張子を持つファイルを1つの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
26
Shane

目的のルートディレクトリから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の拡張機能はありません)

12
David Spillett

%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
13
Gabriel