Bagaimana saya bisa memaksa hanya jalur relatif di output "find"?

22

Saya mencoba membuat skrip yang dapat memampatkan file dengan ekstensi tertentu di sejumlah direktori menjadi satu tar-ball. Saat ini yang saya miliki di file skrip adalah:

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

Di mana $rootDirjalur dasar untuk mencari.

Ini bagus kecuali jalur absolut dalam file tar. Saya lebih suka jalur relatif terhadap $rootDir. Bagaimana saya bisa melakukan ini?

Contoh saat ini tar -tf docs.tardi mana $rootDiradalah /home/username/testkeluaran:

home/username/test/subdir/test.doc
home/username/test/second.doc

Yang saya inginkan adalah:

./subdir/test.doc
./second.doc
Shane
sumber

Jawaban:

12

Jika Anda menjalankan finddari direktori root yang diinginkan dan tidak menentukan titik awal absolut dalam findopsi, itu akan menampilkan jalur relatif ke tarperintah perintah yang dibangunnya. Seperti itu:

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

Jika Anda tidak ingin mengubah direktori kerja saat ini secara permanen dan menggunakan bashatau mirip dengan shell Anda, Anda bisa melakukannya

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

sebagai gantinya.

Perhatikan bahwa pushd / popd tidak ada di semua shell, jadi periksa halaman manual yang sesuai. Mereka hadir dalam bash tetapi tidak dalam implementasi base sh jadi sementara secara eksplisit menggunakan /bin/bashAnda dapat mengandalkan mereka Anda tidak bisa jika skrip meminta /bin/shsebaliknya (karena ini dapat memetakan ke shell yang lebih kecil yang tidak memiliki peningkatan bash)

David Spillett
sumber
Terima kasih. Bekerja dengan cemerlang. Tidak menyadari linux memiliki pushd / popd.
Shane
2
Atau cukup gunakan cd $rootDirdan cd - (setidaknya dalam bash). ( cd $rootDir ; find ... )juga akan mungkin, yaitu melakukan semuanya dalam subkulit.
Daniel Beck
6

Anda dapat menggunakan %Pformat dalam -printfarahan:

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

akan ditampilkan dalam contoh Anda:

subdir/test.doc
second.doc

Anda kemudian dapat menggunakan finddaftar ini dalam forekspresi, untuk menjalankan perintah exec kami, seperti pada:

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