CLI kullanarak dosyaları tarihe göre farklı bir dizine taşıma


9

Düzenlemeye çalıştığım eski bir sabit diskten çok sayıda fotoğrafım var. Çalıştırırsam ls -l, tüm bu dosyaların 2012 veya daha önce oluşturulduğu tarihi fark ettim. İdeal olarak, bunları bilgisayarımın otomatik olarak takılmayacak şekilde ayarlanmış ikinci sabit sürücüsüne taşımak istiyorum. Tercihen, bunları birbirine bağlı bazı komutlarla toplu olarak yapabilirim. Şimdiye kadar, ls -l | grep -i 20122012 tarafından sadece dosyaları tarafından verilen tarihte tüküren var ls -l. Şimdi, hile cptüm bu dosyaları yeni dizine taşıyor olacaktı. Bundan sonra nereye gideceğimi bilmiyorum çünkü her dosyanın kopyalanması gerekecek. Bir sonraki komut setim ne olurdu?

Yanıtlar:


13

Kullanmayın ls. Bu gibi durumlarda kullanılması önerilmez. Ayrıca greptarihe göre filtrelemek iyi bir fikir değildir. 20122012'de değiştirilmemiş olsa bile dosya adınızın kendisi dize içerebilir .

findKomutu kullanın ve çıktısını ekleyin.

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

Buraya,

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 

1
-Exec mv {} / / target / dizininiz \; yerine '-print 0 | xargs -0 cp -t / / target / dizininiz 'isimlerdeki boşluklarla ilgili sorunlar kadar iyi çalışıyor mu? (Ayrıca, OP istedi taşımak değil kopya )
Hagen von Eitzen

^^ Evet. Her ikisi de aynı hedefe ulaşır.
shivams

4

Eski diskte yoksaymak istediğiniz daha yeni dosyalarınız varsa, bu şekilde devam edeceğim

  1. İstediğim dosyaları istemediğim dosyalardan ayıran değiştirilmiş bir tarihe sahip geçici bir işaretleyici dosyası oluşturun
  2. İşaretçi dosyasından daha eski dosyaları yeni konuma kopyalayın

Yeni için eski diskteki herhangi bir dizin hiyerarşisini korumak istediğinizi varsayan bunun için örnek komutlar ( veya cpiobenzeri bir kopya komutudur ):tarpax

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk

2

Sanırım belki bu sorun sizinkilerle aynıdır, bunu da kontrol edebilirsiniz: Alt dizinler oluşturun ve dosyaları tarihe göre düzenleyin

Ben bu sorunun ilk cevabına göre bu komut dosyasını yazıyorum:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. bu komut dosyasını copy.sheski dizininizdeki bir dosyaya yazın.

  2. yerine /your/new/directoryyeni dizininizin yolunu yazın

  3. bu dosyayı ile çalıştırılabilir yap chmod +x copy.sh

  4. sonra bu dosyayı şu şekilde yürütün ./copy.sh


1
Bazı istisna işlemleri eklemek isteyebilirsiniz, böylece komut dosyası kendisini bir 2015dizine taşımaz .
G-Man, 'Monica'yı Yeniden Başlat' diyor

1

Büyük olasılıkla toplu işlemler için bir toplu iş aracı kullanmalısınız. Bunu yapmak, genellikle cpkopyalanan her dosya için ayrı bir işlem çağırmak yerine tüm kayıtları tek bir akışta okumayı / yazmayı gerektirir .

Burada zaten bir cpiocevap var, sadece size sunulan seçenekler göz önüne alındığında, muhtemelen ne seçeceğim. Bununla birlikte, cpioformat, paxen parlak zamanından beri standart arşiv formatı üzerine geliştirildi ve katlandı . Aynı şey doğrudur tar.

Kesinlikle POSIX- pax, arşiv üyelerini dosya değiştirme sürelerine göre doğrudan filtrelemek için herhangi bir seçenek sunmaz - ancak standart, %Tliste modu biçim değiştiricisini belirtir . Yine de, paxbildiğim en yaygın uygulama - mirabilos tarafından sağlanan BSD versiyonu - bunu doğrudan erişilebilir bir CLI anahtarına genişletiyor.

Örneğin, en köklü ağaçta yalnızca tüm dosyaları kopyalamak için ./önce son değiştirilme edildiği ccyymmddHHMMiçin /target/dirbunu yapabilirsiniz:

pax -rwT,201301010000 ./ /target/dir

Alt dizinlere yinelenmekten kaçınmak için bunun yerine şunları yapabilirsiniz:

pax -rwdT,201301010000 ./* /target/dir

Daha manfazla bilgi için sayfaya bakın .


Ben gerçekten öğrenmek gerektiğini tahmin pax, ama tarve cpioyine de beni ayakta. +1
roaima

@roaima - açık konuşmak gerekirse, gerçek bir paxarşiv formatı ( ustar formatının bir uzantısıdır ) varken , POSIX'e özgü pax yardımcı program cpio, pax ve ustar formatlarını okur / yazar. Üç arşiv türünün tümü, söz konusu dosyaların gerçek verilerinin yanı sıra birçok dosya için meta verileri kodlamanın farklı yollarını tek bir akış halinde oluşturduğundan, bu gerçekten çok fazla değildir. Bir keresinde yazdım shitar- bu sadece birkaç satır kabuk komut dosyasıydı - çoğunlukla dd- tarPOSIX spesifikasyonuna göre anında blok geliştiricileri.
mikeserv

Bağlantılı betiğinizi seviyorum; garip bir şekilde, birkaç ay önce tam olarak aynı amaç için çok faydalı olurdu. Oh iyi. Hatta kullanmayı bırakmayı deneyebilirim cpio -H ustar...
roaima
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.