Dizin yapısını koruyarak bir dizindeki tüm PDF'leri kaldırın


11

Dizinlerimden birinde bulunan tüm PDF dosyalarını içeren sıkıştırılmış bir tarball oluşturmaya çalışıyorum. Dizin yapısının korunması gerekir. Boş dizinlere ihtiyaç yoktur, ama orada olup olmadıkları umurumda değil.

Örneğin, şöyle bir dizin buldum:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

Komutu çalıştırdıktan sonra, bu içeriğe sahip olmak istiyorum dir.tar.gz:

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

Mümkün?

Yanıtlar:


10

Bu, tüm PDF'leri listeler:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

Sen o boruyu can xargso tek boşlukla ayrılmış bir çizgi olarak almak ve yem için tarbir arşiv oluşturmak için:

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(Bu şekilde boş dizinleri atlar)


1
Bu harika, yardım için teşekkürler. İşte geldiğim şey:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
Matt Alexander

3
@mattalexx: Dosya adlarından herhangi biri boşluk veya \'"(xargs hatası) içeriyorsa bu komutun çalışmayacağını ve çok fazla dosya adı varsa (çekirdeğin hatası) çalışmadığını unutmayın.
Gilles 'SO- kötü olmayı bırak'

2
@Gilles Boşluklu ve tek tırnaklı dosya adları ile ilgili -printf '"%p"\n'kısım bununla ilgilenir (en azından benim için yaptı).
Matt Alexander

1
@Gilles Çekirdek kısıtlaması hakkında ilginç. Linux'ta bir komutta kaç argüman olabilir?
Matt Alexander

5
"Çalışmaz" durumunda, buradaki başarısızlık modunun, komut satırı çok uzunsa, xargs'ın bölüneceğine dikkat edin, böylece son katran çağrısı, önceki çağrılar tarafından yazılan dosyaların sessizce üzerine yazılacaktır .
Gilles 'SO- kötü olmayı bırak'

6

Bash ≥4 veya zsh ve GNU katran ile:

tar -czf dir.tar.gz dir/**/*.pdf

Çok sayıda PDF dosyanız varsa ve komut satırı çok uzunsa bu işe yaramayabilir. Sonra daha karmaşık bir bulmaya dayalı çözüme ihtiyacınız olacak (yine GNU katranı kullanarak):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

Alternatif olarak (ve portatif olarak) arşivi pax ile oluşturabilirsiniz .

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

Birincisi , adlarını değiştirmeden -stüm .pdfdosyaları içerdiğini söylüyor . İkincisi -s, diğer tüm dosyaları boş bir adla yeniden adlandırmayı söyler, bu da onları arşive dahil etmemek anlamına gelir.


Ah evet, zsh'lardan bahsetmek istedim **; Hatta bash 4 şimdi vardı farkında değildi
Michael Mrozek
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.