複数のディレクトリにある特定の拡張子を持つファイルを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
目的のルートディレクトリから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の拡張機能はありません)
%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