Yanıtlar:
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, F1
dizini 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:
p
içinde photo
büyük harfe.ls
ayrış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.
find -type d F1
, olabilir?
$i/Photo
, ancak OP'nin bu durumda ne yapılması gerektiğini belirtmediğini unutmayın. Kuşkusuz, $i
s'den birinin yeni satır içerdiği kabul edilemez durumda da başarısız olacaktır .
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) Photo
dizinleri tekrarlamamayı söyler : Bulunan dosya (veya dizin) adı varsa Photo
, işlemeyi durdurun ( -prune
). Diğer durumda ( -o
), directories ( -type d
) ile devam edin -exec
ve komutu ( ) yürütün .
-prune
? :) Evet, oldukça sezgisel ama öğrenmeye değer.
-type d
ile birlikte -name 'Photo'
önce -prune
.
find
diğer klasörlerle devam edecek (eğer isterseniz, o klasörün alt klasörleri dahil).
Bunun yerine find
sonuçları aktarabilirsiniz çünkü dosya adlarında boşluk varsa bu şekilde kırılmazwhile
for
Önce dizine cd F1
, sonra şunları yapın:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Dizin varsa, mkdir
oluş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 :)
F1
dizini ise ~user/Pictures
, ana dizine geçmek ve satırı çalıştırmak, Photo
alanındaki her dizine binlerce olabilecek bir dizin koyacaktır . F1
Kolayca 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.
F1
yerine yapmanızı öneririm , @LDJames
Python ile os.walk
bunu 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
Üzerinde çalıştığımız şu komut: python -c 'import os; [os.mkdir (r + "/ Resimler") os.walk (".")]'
Burada -c
tek 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
Eğer bash kullanıyorsanız, şunları yapabilirsiniz:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
Bu globstar
seç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, $d
geçerli dizindeki tüm dizinleri ve alt dizinlerini yineleyecek ve Photos
her birinde dizin oluşturulacaktır.
-p
Bayrağı mkdir
aracı:
-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ı Photo
bir 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.