Tüm dizinlerin içinde özyinelemeli bir "Fotoğraf" klasörü oluşturun


9

Bir sürü klasörüm var ve tüm bu klasörlerin üzerinden geçmek istiyorum ve her klasörde "Fotoğraf" adlı başka bir klasör oluşturmak

F1
--F11
----F111
----F112
--F12

Ben sahip olmak istiyorum:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo

Yanıtlar:


8

F1'in hemen üzerindeki dizinden şu komut dosyasını çalıştırın:

Komut dosyasının amacı, fotoğraf dizinleri altında yedekli fotoğraf dizinlerinin oluşturulmasından kaçınmaktır.

Ayrıca, kullanıcının kök dizini gibi yanlış bir konumdan yanlışlıkla çalıştırılmasını önlemek için tasarlanırken, F1dizini görmez ve yanlışlıkla yanlış saraylarda yüzlerce fotoğraf dizini oluşturur.

Ayrıca, kullanıcının onu özelleştirebilmesi için betiği takip etmeyi kolaylaştırmak niyetimdi.

#!/bin/bash

while IFS= read -r -d '' i;
do
    if [[ ! -d $i/Photo ]]; then
        # Filter to skip folders named Photo
        thisfolder="$(echo $i | sed "s/.*\///")"
        if [[ ! $thisfolder == "Photo" ]]; then
            mkdir "$i/Photo"
        fi
    fi
done < <(find F1 -type d -print0)

Komut Dosyası Güncellendi:

  • Küçük harf değiştirildi piçinde photobüyük harfe.
  • Stander olmayan dosya adları için destek eklendi (Terdon'un önerileriyle).

1
Kesinlikle ls ayrıştırmaktan kaçınırım , olağandışı şekillerde başarısız olabilir. Bundan kaçınan cevapların muhtemelen daha güvenli olduğunu düşünüyorum.
Arronical

3
@Arronical lsayrıştırılmaz. Sadece kullanıcıya geri bildirim ... ne olduğunu gösteriyor. Tıpkı "Bu bir fotoğraf dizini" sözcükleri gibi. Kullanıcının neden orada bir dizin oluşturmadığını bilmesini sağlar.
LD James

1
Böyle bir şey olduğunu düşünemediğim için durumun böyle olabileceğini düşünmüştüm. Bu durumda,
yorumumu

find -type d F1, olabilir?
Olivier Grégoire

Bir dosya (dizin değil) denirse bunun başarısız olacağını $i/Photo, ancak OP'nin bu durumda ne yapılması gerektiğini belirtmediğini unutmayın. Kuşkusuz, $is'den birinin yeni satır içerdiği kabul edilemez durumda da başarısız olacaktır .
terdon

24

Bunu tek bir findçağrı kullanarak başarabilirsiniz .

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

Parça -name 'Photo' -prune -o, var olan (ve yeni oluşturulan) Photodizinleri tekrarlamamayı söyler : Bulunan dosya (veya dizin) adı varsa Photo, işlemeyi durdurun ( -prune). Diğer durumda ( -o), directories ( -type d) ile devam edin -execve komutu ( ) yürütün .


ah güzel, bu şekilde denedim ve cevabınızdan nerede yanlış gittiğimi görüyorum :)
Zanna

@Zanna -prune? :) Evet, oldukça sezgisel ama öğrenmeye değer.
Melebius

'Fotoğraf' adlı bir dosya varsa 'Fotoğraf' klasörü oluşturmayı durduracak mı?
Anwar

3
@Anwar Geçerli sürüm olacak. İhtiyaçlarda gri bir bölge var. :) Sen belirterek değiştirebilirsiniz -type dile birlikte -name 'Photo'önce -prune.
Melebius

2
@Anwar İkinci bakışta mantıklı değil. Aynı klasörde normal dosyayla aynı ada sahip bir klasör oluşturamazsınız. Ve finddiğer klasörlerle devam edecek (eğer isterseniz, o klasörün alt klasörleri dahil).
Melebius

9

Bunun yerine findsonuçları aktarabilirsiniz çünkü dosya adlarında boşluk varsa bu şekilde kırılmazwhilefor

Önce dizine cd F1, sonra şunları yapın:

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

Dizin varsa, mkdiroluşturmayı reddedecektir, bu yüzden orada sorun yok ...

Dizin adlarınız yeni satırlar veya başka egzotik tuhaflıklar içeriyorsa, rasgele adlarla baş edebilecek olanı kullanın:

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done

Bu konuda yardım için @terdon'a teşekkürler :)


Operasyonun F1dizini ise ~user/Pictures, ana dizine geçmek ve satırı çalıştırmak, Photoalanındaki her dizine binlerce olabilecek bir dizin koyacaktır . F1Kolayca yapılan bir hatadan kaçınmak için komutanın bir parçası olarak eklemeyi düşünün . Bu şekilde yanlışlıkla yanlış yerden çalıştırılırsa, dizin oluşturmaz.
LD James

ah evet aslında onların dizin yapısından emin değildim. Bunun F1yerine yapmanızı öneririm , @LDJames
Zanna adlı

5

Python ile os.walkbunu oldukça kolay ve sadece birkaç satırda yapabilirsiniz

$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'                 
$ tree
.
├── dir_one
│   └── Pictures
├── dir_two
│   ├── dir_three
│   │   └── Pictures
│   └── Pictures
└── Pictures

açıklama

Üzerinde çalıştığımız şu komut: python -c 'import os; [os.mkdir (r + "/ Resimler") os.walk (".")]'

Burada -ctek tırnak içinde verdiğimiz komutu belirtmek için bayraklı python yorumlayıcısını çağırıyoruz . os.walk()işlevi, tüm alt dizinlerde yinelemeli olarak adım atmamızı sağlar ve her bir alt dizin için (ile temsil edilir r), os.mkdir()işlevler aracılığıyla Resimler klasörü oluştururuz . r+"/Pictures"sadece bir yol oluşturmak için alt dizin dizesini ve "/ Pictures" dizesini birleştirmek için basit bir dize manipülasyonudur

Gereksinimlerinize uyacak şekilde "/ Resimler" i "/ Fotoğraf" ile değiştirin


4

Eğer bash kullanıyorsanız, şunları yapabilirsiniz:

shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done

Bu globstarseçenek **"tüm dosyalar ve 0 veya daha fazla dizin ve alt dizin" ile eşleşir. Başka bir deyişle, her şeyi yinelemeli olarak eşleştirir. /Sonunda nedeniyle, **/tüm dizinleri ve alt dizinleri (dosya) eşleşir. Bu nedenle, $dgeçerli dizindeki tüm dizinleri ve alt dizinlerini yineleyecek ve Photosher birinde dizin oluşturulacaktır.

-pBayrağı mkdiraracı:

  -p, --parents
          no error if existing, make parent directories as needed

Burada, sadece hedef dizin zaten varsa hata iletilerini bastırmak için kullanıyorum. Hataları görmek istiyorsanız kaldırın.

Bunun, Fotoğraf adlı Photobir dosya içeren bir hedef dizinde bir alt dizin oluşturmayacağını unutmayın . Yine de bu durumlarda ne yapılması gerektiğini belirtmediniz ve şu ana kadar gönderilen diğer yanıtların hepsinde de bu sınırlama var.

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.