"Bul" çıktısında yalnızca göreli yolları nasıl zorlayabilirim?


25

Tek bir tar-ball içine dizinlerin bir dizi belirli bir uzantıya sahip dosyaları sıkıştırabilirsiniz bir komut dosyası oluşturmaya çalışıyorum. Şu anda komut dosyasında ne var:

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

$rootDirAranacak temel yol nerede .

Bu, tar dosyasındaki yolların mutlak olması dışında iyidir. Yolların göreceli olmasını tercih ederim $rootDir. Bunu nasıl yapabilirim?

Akımın Örnek olduğu çıkışı:tar -tf docs.tar$rootDir/home/username/test

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

Ne çıktı olmasını arzu:

./subdir/test.doc
./second.doc

Yanıtlar:


12

findİstediğiniz kök dizinden çalıştırırsanız ve findseçeneklerinde mutlak bir başlangıç ​​noktası belirtmezseniz , oluşturduğu tarkomut çağrılarına göreli yollar çıkarır. Şöyle ki:

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

Geçerli çalışma dizinini kalıcı olarak değiştirmek istemiyorsanız ve bashkabuğunuza benzer veya benzeri bir şey kullanıyorsanız

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

yerine.

Pushd / popd'nun tüm mermilerde bulunmadığına dikkat edin, bu yüzden man sayfasını uygun şekilde kontrol edin. Bash'de mevcutlar, ancak temel sh uygulamasında değiller, bu yüzden açıkça kullanırken /bin/bashonlara bir komut dosyası isterse yapamazsınız /bin/sh(bu, bash'ın geliştirmeleri olmayan daha küçük bir kabukla eşleşebileceğinden)


Teşekkürler. Zekice çalıştı. Linux pushd / popd olduğunu fark etmedi.
Shane

3
Veya sadece cd $rootDirve kullanın cd - (en azından içeri bash). ( cd $rootDir ; find ... )her şeyi bir alt kabukta yapmak da mümkündür.
Daniel Beck

9

Sen kullanabilirsiniz %Pbiçimi -printfyönergesi:

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

örneğinizde gösterilecek:

subdir/test.doc
second.doc

Daha sonra bu komutu exec komutumuzu çalıştırmak için aşağıdaki gibi findbir forifadede kullanabilirsiniz :

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

1
Kabul edilen çözüm işe yarıyor ama temelde bir hack. IMHO bu sorunun doğru çözümü olmalıdır.
Narcolessico

Teşekkürler Narcolessico. Ayrıca MHO :-)
Gabriel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.