Mkdir'e dir1 oluşturmayı denemesini nasıl söyleyebilirim ve zaten varsa, var olmayan bir isme çarpana kadar dir2, vb.


13

Ben sonunda "dir1", bir sayı ile bir dizin oluşturmak istiyorum ve dizin var olmayan bir dizin ismini vuruncaya kadar zaten varsa bu sayıyı artırmak ve bunu tek bir satırda yapmak gerekir Linux komut satırı, şuna benzer:

mkdir --increment dir$

Bunu nasıl yapabilirim?

Şimdiye kadar bunu aldım:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

Ama sadece bir sonraki dir adı echos, komutu tekrar tekrar yürütmek için ihtiyacım var.

Yanıtlar:


26

Bu, aşağıdakilerin kullanımında önemsiz bir egzersizdir while:

n = 0
süre ! mkdir dir $ n
yapmak
    n = $ ((n + 1))
tamam

Fakat elbette bu önemsiz mekanizmanın iyi ölçeklenmediğini anlamak fazla düşünülmüyor.

Bu nedenle, tekerleği yeniden icat etmek ve tüm köşeleri tekrar tıraş etmek yerine, bir şablondan biraz farklı benzersiz geçici dizinler oluşturur:

name = $ (mktemp -d dirXXXXCPX)


Numara üzerinde ikili arama yeterince iyi olabilir.
Thorbjørn Ravn Andersen

Tekerleği yeniden keşfetme işlemine başladığınız yerden tıraş etmek için çok az köşe var, en azından dosya sistemini hatırlayan, güvenliği ve paralelliği göz önünde bulunduran değil.
JdeBP

6

Sadece doğru sırada listelenen dizinleri aşamalı olarak oluşturmak istiyorsanız, bunun yerine geçerli tarihe göre adlandırılmış klasörleri önerebilir miyim?

DATE=$(date +%F)
mkdir "dir-$DATE"

dir-2014-03-02( Gibi isimler ( YYYY-MM-DDalfabetik sırayla görünecek şekilde) ile dizinler yaratacaktır .

Günde birden fazla dizin oluşturursanız, geçerli saati dosya adına ekleyebilirsiniz. man dateÇıktı biçimlendirmesinin nasıl ayarlanacağına bakın date.


5

önce "en büyük" dirname'yi bulun, numarayı ve artışı artırın:

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

Bu iyi bir fikir, ama paralellik etmek kolay değil.
Thorbjørn Ravn Andersen

Milyonlarca dizin olmadığı sürece, paralelleştirme kesinlikle erken optimizasyondur.
glenn jackman

Neden printfburaya ihtiyacın var? Basit bir echoiş olmayacak mı?
Ruslan

Ayrıca, dir[0-9]*yerine kullanmak istiyorum dir*.
Ruslan

1
Yanlış anlıyorsun. Senaryo bir kerede birden çok kez (birden çok iş parçacığı, birden çok kullanıcı vb.) Çalıştırılmaya duyarlı olup olmadığı hakkında konuşuyorum.
Thorbjørn Ravn Andersen

2

Dizinlerinizin her zaman "dir1" de başladığını ve $ dir * adında hiçbir dosya bulunmadığını varsayalım (yani hepsi sıralı olarak numaralandırılmış dizinlerdir), bu tek astarla kurtulabilirsiniz -

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

Bu, $ dir ile başlayan dosya sayısını sayar, ardından bu numaraya bir dosya ekler ve yeni bir dosya oluşturur.


0

Diğer cevaplara zeyilname: Eğer dirs isimleri doğru sıralamak için gerekiyorsa, yeni dir numarasını (NUM) önde gelen sıfırlar ile sabit bir uzunluğa doldurmak isteyebilirsiniz.

Aşağıdakiler bir hatta yoğunlaştırılabilir veya diğer çözümlerden birine gömülebilir.

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

Bu, NUM'nin en az 1 basamak uzunluğunda başladığını ve sabit uzunluğu aşmayacağını varsayar. Gereksinimlerinize göre ayarlayın.

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.