Tekrarlı olarak dizinleri nasıl gözden geçirir ve dizinden sonra bir dosyayı nasıl adlandırabilirim?


0

Yapmaya çalıştığım, bir alt dizindeki tüm dosyaları yeni bir dosyada birleştirmek ve yeni birleştirilmiş dosyaya alt dizinle aynı adı vermek ve bunu Bash'te nasıl yapacağım hakkında hiçbir fikrim yok. İşte ona bu şekilde yaklaştım: Her biri benzersiz bir dosya adına (boşluklara sahip) bir dizi klasörüm var. Bu dizinlerin her birinde, bunun gibi, sayısal olarak adlandırılmış bir dizi dosya vardır:

Home/Unique name/1.pdf  
Home/Unique name/2.pdf  
Home/Unique name/3.pdf  
Home/Unique name/4.pdf  
....  
Home/Other Unique name/1.pdf  
Home/Other Unique name/2.pdf  
Home/Other Unique name/3.pdf  
Home/Other Unique name/4.pdf

Yapmak istediğim, bash betiğini (dizinden) şuna yazmak Home:

  1. Her benzersiz dizine gidin ve bu dizindeki her dosya için bir komut verin (benim durumumda hepsini farklı bir dizine kopyalayın).
  2. Daha sonra script.shbaşka bir komut verecek farklı bir komut dosyası yazdım (bu durumda, tüm PDF'leri tek bir dosyada birleştirin temp.pdf). Daha sonra bu temp.pdfdosyayı dizinden sonra yeniden adlandırmak istiyorum Unique name.pdf(boşluklu).
  3. Birkaç alt dizin için bu süreci izlemem gerekecek.

Döngüler ve find komutunu kullanırken birkaç döngü için bir çözüm denedim, ancak rahatça hata ayıklamak veya bu değişkenleri herhangi bir güvenle kullanabilmek için bash ile yeterince rahat değilim. Yaptığım şeyi yapmanın daha etkili bir yolu olduğundan da eminim, ancak senaryoyu bir süredir birlikte başlattım.


Nispeten basit bir C veya Java programı olmalı.
Daniel R Hicks

Eğer düz metin olarak kodlanmış dosyalar için yapıyoruz sürece, sonuç dosyaları olacak değil geçerli sayılacak. Sadece birkaç PDF'leri içinde ikili veri bağlamak Örneğin, çıkan dosya değil (eğer şanslıysanız, bir PDF uyumlu dosya olabilir size ilk PDF sadece göster). Katılmak istediğiniz dosyaların formatı için belirli bir araca ihtiyacınız vardır. Bununla birlikte, birkaç dosyaya katılmak catiçin hepsini uygun sırayla görüntülemek ve sonuçlarını catyeni bir dosyaya aktarmak için kullanabilirsiniz.
Atılım

@DanielRHicks Bu basit bir şey için C kullanarak çok komik overkill olurdu
evilsoup

Yanıtlar:


1

POSIX yolu kullanmaktır print . -type d ... | while read f; do, ancak% 100 taşınabilirliğe takıntılı olmadığınız sürece, bununla uğraşmazdım. Bash 4+ varsa ve pdfunite(varsayılan olarak Ubuntu 13.04’e yüklüyse), bunu iki satırda yapabilirsiniz:

shopt -s globstar
for f in ./**/; do pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done

Not shopt -s globstargeri kalanı için ayrı bir satırda olması gerekir. Globstar etkinken, **geçerli dizindeki tüm dosyalara ve dizinlere tekrarlı bir şekilde genişler. Dosyalar /adlarında **/içeremediğinden, yalnızca dizinlere genişletilir. ./**/Olası bir olayda, dizinlerinizin bir tire ( -) ile başlamasından dolayı kullanıyorum , çünkü bu sorunlara neden olabilir, çünkü birçok program -bir seçenek olarak başlayan herhangi bir şeyi ele alır .

Yazıldığı gibi, bu, PDF'leri başka bir dizine kopyalamaz, ancak eklemek için oldukça önemsizdir:

for f in ./**/; do cp "$f"/*.pdf /target/dir/; pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done

Kendi özel pdf-birleştiren komut dosyanızı kullanmak istiyorsanız, çizgiyi uyacak şekilde değiştirin - ancak kabuk komut dizisinin özünün önceden var olan komutları bir araya getirdiğini unutmayın.

İşte biraz daha taşınabilir bir sürüm:

print . -type d -print0 | while read -d $'\0' f; do
  pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"
done

0
  1. Değişken olarak fordöngü oluşturfind /home/ -type f -name "*.pdf"
  2. İhtiyacınız olan dosyaları kopyalayın, $ VARIABLE alın ve "/" yi kaldırmak için sed / awk aracılığıyla işleyin.

Komut dosyanızı yayınlayın, geliştirmenize yardımcı olabiliriz.

Senaryoları bash -xhata ayıklamak !#/bin/bash -xiçin her zaman çalıştırabilir veya her zaman hata ayıklama (ayrıntılı) modunda yürütmek için ayarlayabilirsiniz .

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.