Alt dizinlerdeki tüm .jpg, .mp3 ve .mts dosyalarına, ilgili üst dizin adlarına göre öncelik verin.


1

Binlerce dizin içeren bir dizin ağacında düzenlenen ve etiketlenen onlarca yıllık aile fotoğraf ve videolarına sahibim. Genelde dosya yolları, şunlara benzer:

/ my_giant_pictures_dir / year / month_day_ "olay açıklaması" / dosyaadı

bir örnek olabilir:

/ my_giant_pictures_dir / 2016 / 07_27_ Antarktika / IMG_00001.jpg 'e geri dönüş

"olay" veya en derin dizinlerin .jpg, .mp4 ve .mts dosyaları içerebileceğini unutmayın.

Bu konvansiyonla ilgili sorunum, önce tarihe göre organize edildikleri için sadece bir veya birkaç dosya içeren medya içeren en derin dizinlerle sonuçlanmam. (Örneğin, yalnızca bir resmin çekildiği günler). Bu, örneğin, üç aylık bir süre içinde çekilen tüm resimlerin oldukça sıkıcı görünmesini sağlar.

Her şeyi olduğu gibi kronolojik sırayla tutarak, ancak tüm orta alt dizinleri yıl sonra elimine ederek tüm bu medyayı yeniden yapılandırmak istiyorum. Bunu, her medya dosya ismini, ana direktörünün "month_day_event" ismi ile hazırlayarak yapmak istiyorum, örneğin:

yerine:

/ Resimler / 2016 / 07_27_Antarktika'ya geri dön / IMG_00001.jpg

...İsterim:

/ Resimler / 2016 / 07_27_Antarktika'ya geri dönün_IMG_00001.jpg

Bütün resim dizinimdeki her .jpg, .mp4 ve .mts dosyası için bunu yapacak bir bash komutu var mı, sonra da dosya isminin hazırlanmasından sonra, onları ana dizinden çıkarıp bir sonraki en yüksek dizine götürün. yıl dizini nedir?

Ve belki de çok fazla şey soruyor, ancak yıl dizinleri içinde yer alan boş alt dizinleri de silebilir mi? Gerekirse çoklu komut çalıştırmaktan sakıncası yoktur, çünkü, her iki durumda da, cevabınız beni saatlerce koruyacak.

Şimdiden çok teşekkür ederim!

Yanıtlar:


1

Deneyin:

find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)' -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

Nasıl çalışır

  • find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)'

    Bu /my_giant_pictures_dir/, isimleri jpg, mp4 veya mts ile biten herhangi bir alanda tüm normal dosyaları arar . Bu dosyaların her biri sırayla kendisine iletilir -execdir.

  • -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

    Bu, dosyayı yeniden adlandırırken aynı zamanda dosyayı ana dizine taşır.

    Daha ayrıntılı olarak, -execdir bash -c '...' Bash {} \;geçerli çalışma dizinini dosyanın bulunduğu dizine değiştirir ve bash -c '...'bağımsız değişkenlerle Bashve dosya adıyla yürütür {}.

    bash -c '...'komutu, tek tırnaklı ifadelerde $0değerini Bashve $1değeri dosya adını alarak çalıştırır.

    Tekli tırnak işaretleri içinde, Biz mv "$1" "../${PWD##*/}_${1#./}"bu dosyayı, adı ile birlikte $üst dizinine taşır .../${PWD##*/}_${1#./}


1
Şaşırtıcı, mükemmel çalıştı. Aslında üçten fazla dosya tipim vardı, bu yüzden sentaksını takiben arama kriterlerine eklemek zorunda kaldım, ama evet, hepsi harika çalıştı ve neredeyse hiç zaman aldı. Çok teşekkür ederim!
Ross Inman
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.