Bir grup dosyayı taşıyın ve kullanıcıdan her dosya için onay isteyin


9

Sistem: Ubuntu MATE 18.04.

(Bir dizin yapısında birden çok dizin) dosyaları bir koleksiyon var ve bunların çoğunu başka bir dizine taşımak istiyorum. Hangi dosyaları isimlerine göre taşımak istediğimi söyleyebilirim (tarif başlıklarıdır), ancak taşımak istediğim dosyaları ve taşımak istemediğim dosyaları ayırt etmenin başka bir yolu yoktur; İsmi kendim inceleyerek her dosya için karar vermem gerekiyor.

Taşımak istediğim her dosya için bir kez komut çalıştırıyorum.

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

Sekme tamamlandığında bile bu çok fazla yazımdır. Gerçekten yapmak istediğim şey

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

Böylece her dosya için yveya tuşuna basabilirim n.

Bir grup dosyayı nasıl taşıyabilirim ve her dosya için onay istenebilir mi?

Yanıtlar:


6

1. Yol: Grafik dosya tarayıcınızda, bir ağaç görünümü kullanarak

Ben gerçek hedefi, her dosya için bir seçim yapmak olduğunu varsayalım ve kesinlikle edilecek konuşmuyorum istenir . Ancak, bir terminaldeki her dosya hakkında bilgi istenmesini tercih ediyorsanız, aşağıdaki 2. Yola bakın.

Çoğu grafik dosya tarayıcısı, bir dizin hiyerarşisinin birden çok düzeyini birlikte görüntüleyebileceğiniz bir ağaç görünümünü destekler. Dosyaları tek tek veya seçerek ve tüm seçimde çalışarak bu görünümden kopyalayabilir veya taşıyabilirsiniz. Bu, birden fazla klasördeki dosyalarla bile çalışır.

Bazı dosya tarayıcılarında ağaç görünümünü etkinleştirmek için Tercihler menüsüne girilmelidir. MATE dosya tarayıcısı Caja'da liste görünümünde her zaman etkindir. Liste görünümüne geçmek için Görünüm → Liste'yi tıklayın (veya Ctrl+ tuşuna basın 2). Her dizinin solunda, genişletilebileceğini gösteren, sağa bakan küçük bir üçgen vardır. Bir klasörü genişletmek için o üçgeni tıklatın veya klasör seçildiğinde (sağ ok) tuşuna basın . Bu örnekte, hepsini tek tek seçtim ve hepsini aynı anda hedeflerine sürükliyorum:

Caja dosya tarayıcısında bir ağaç yapısında seçilen, başka bir klasöre sürüklenen ancak henüz taşınmamış birden çok dosya

Kaynak ve hedefin aynı sürücüde olduğu varsayıldığında, sürükleme varsayılan olarak hareket eder. Bunun yerine kopyalamak isterseniz, Ctrltuşu basılı tutarsınız .

seçili dosyaların artık orijinal ayrı konumları yerine artık hedef klasörde bulunduğu sürükle-taşı işlemi tamamlandıktan sonraki durum

Teoride, bu yöntemi kullanırken hataları düzeltmek kolaydır, çünkü çoğu dosya tarayıcısı (Caja dahil) toplu işlemler de dahil olmak üzere son eylemleri geri almak için Ctrl+ ' Zyı destekler . Ancak, bununla karışık şanslar yaşadım. Bazen dosyalar yanlış klasöre geri döner.

İyi haber şu ki, çoğunlukla küçük olma eğilimindeki metin belgeleriyle çalışıyormuşsunuzdur, böylece tarilk önce çok fazla uğraşmadan ekstra bir yedekleme yapabilirsiniz . Hangi yöntemi kullanırsanız kullanın bunu öneriyorum.

Yol 2 : findkomut -okeylem

findDosyaları bulmak ve yollarını -execve -execdireylemleriyle rastgele bir harici komuta geçirmek yaygın bir uygulamadır. Ama findaynı zamanda sahiptir -okve -okdiristemi her zaman önce bir komutunu çalıştırın. Gerçekten her dosya hakkında bir terminalde istenmesini istiyorsanız, bu gitmek için yol olduğunu düşünüyorum.

Yukarıda gösterildiği gibi aynı efektleri üretmek için bittiğinde, bu şöyle görünür:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Değiştir Texts(sadece olabilir kaynak dizini ile .sen eğer cdkendisine 'd) ve Glorious Destination Foldergerçek hedef dizin ile.

Bu, dosya başına bir komut çalıştırır; aksine -execve -execdir, -okve -okdirdesteklemeyen +yerine \;bir komut aynı çağırma birden FOUND yolları geçmek. Sonuç olarak, formunu kullanmanıza gerek yoktur . Yine de bunu yapmayı öneririm, hem genel olarak hem de özellikle bu durumda, istemler istedikleri komutlara daha çok benziyor.-t destmvfind

Bu komut yazılırken, findnihayetinde normal bir dosyayı işaret eden sembolik bir bağlantıyla karşılaşırsa, bu dosya (hedef değil, bağlantı) yok sayılmak yerine taşınır. Gerçekten tek bir normal dosyayı çalıştırmak istiyorsanız, -type fyerine kullanın -xtype f.

Bunu bir scriptoturumda yapmak isteyebilirsiniz, böylece bir hata yaparsanız ne olduğunu anlayabilirsiniz. Ama yine de, yedek almamak için bir neden yok.

3. Yol: Bir bildirim oluşturun ve düzenleyin

En azından dosyalar adlarında yeni satır içermediği sürece, manifestfind oluşturmak için basit bir komut kullanarak başlayabilirsiniz - ilgilendiğiniz dosyaların adlarını listeleyen bir dosya (bu durumda potansiyel olarak) :

find Texts -xtype f >manifest

manifestSöz konusu dosyaları listeleyen dosya için istediğiniz adla değiştirin (ve kalan yönleri buna göre ayarlayın).

Yukarıda olduğu gibi, yerine Textsolabileceğini, hangi gerçek kaynak dizini ile .Aşağıdaki durumlarda cdkendisine 'd. Ancak, Textsgöreli bir yol ise (eğer dahilse .), daha sonra hareketleri gerçekleştirirken aynı konumda olduğunuzdan emin olmalısınız .

Bu findkomutu çalıştırdıktan sonra manifestbir metin düzenleyicide açın. Bu olabilir nano, vim, emacs, gedit, pluma, vb düzenleyicisinde, dışarı comment adı dosyaları ettiği çizgi yok bir yerleştirerek taşımak istediğiniz #bunlardan başında. Bazı düzenleyiciler, dosyanızı yorumlarının bildiği herhangi bir biçimde tanımıyor olsa bile bu satırları farklı şekilde vurgulayacaktır. Çoğu olmayacak ve bunu bu şekilde yapmamın gerçek nedeni, bir insan olarak, yapılandırma dosyalarında (ve belki de kaynak kodunda) satırları yorumlama deneyimine sahip olmanızdır. Ben size satırları işaretlemek olacağını daha bu, yüzükoyun daha sezgisel ve daha az hata olduğunu düşünüyorum do taşımak istiyorum.

Elbette, taşımak istemediğiniz dosyaların satırlarını silebilirsiniz . Onları yorumlamanın avantajı, daha sonra ne yaptığınızı netleştirecek olmasıdır.

Örneğimde, düzenledikten sonra dosyanın içeriği böyle görünüyordu:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

Ardından, yorum yapılan satırları filtreleyebilir grepve sonuca xargsiletmek için sonucu borulandırabilirsiniz mv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

Yukarıdaki gibi, Glorious Destination Foldergerçek hedefin adıyla değiştirin . Bu kadar; dosyalarınız taşınır. İsterseniz ilk önce çalıştırılacak komutları görmek için daha echoönce yazabilirsiniz mv.

Komutun çalışma şekli:

  1. grepKomutunun çıkış hatları gelen manifestbu yok ( -v) (başlangıç ^isteğe (ile) *) boşluk ( \sbir hazır takip eder) #karakter. -PBayrak (sağlayan düzenli ifadeler lehçesi olarak PCRE'yi seçmek \sgeleneksel daha okunabilir düşünün ki [[:space:]]).
  2. xargsKomutu (çıktısını onun giriş bölen grepsatır-sonlu alanı (da) -d '\n'), sonra komut sonunda ayrı bir bağımsız değişken olarak (sonlandırıcı yeni satır olmayan), her bir alan yapıştırır mv -t 'Glorious Destination Folder'çalıştırır.

1
-okIMHO en iyi cevap
pim

7

İşte küçük bir script ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

Örnek kullanım:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

komut dosyasını yürütülebilir yapmayı unutmayın ( chmod +x mv-confirm.sh).

NB

Dosyalarınızla uğraşmak istemediğim için echoasıl mv komuttan önce ekledim . Dosyaları gerçekten taşımak için kaldırmaktan çekinmeyin.

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.