Pindahkan file berdasarkan tanggal ke direktori berbeda menggunakan CLI

9

Saya memiliki banyak gambar dari hard drive lama yang saya coba atur. Jika saya menjalankan ls -l, saya perhatikan semua file ini memiliki tanggal pembuatan 2012 atau sebelumnya. Idealnya, saya ingin memindahkan ini ke hard drive kedua komputer saya, yang tidak diatur untuk dipasang secara otomatis. Lebih disukai, saya bisa melakukan ini semua sebagai batch dengan beberapa perintah yang dihubungkan bersama. Sejauh ini, saya memiliki ls -l | grep -i 2012yang hanya memuntahkan file dengan 2012 pada tanggal yang disediakan oleh ls -l. Sekarang, triknya adalah memasukkan cpsemua file itu ke direktori baru. Saya tidak yakin ke mana harus pergi berikutnya dengan ini karena setiap file harus disalin. Apa yang akan menjadi set perintah saya berikutnya?

nerdenator
sumber

Jawaban:

13

Jangan gunakan ls. Tidak disarankan untuk digunakan dalam kasus seperti itu. Apalagi menggunakan grepuntuk memfilter menurut tanggal bukan ide yang baik. Nama file Anda mungkin berisi 2012string, meskipun tidak dimodifikasi pada 2012.

Gunakan findperintah dan pipa hasilnya.

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

Sini,

-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 
shivams
sumber
1
Tidak akan `-exec mv {} / direktori / target / Anda \; ' bukannya '-print 0 | kerja xargs -0 cp -t / your / target / direktori 'sama baiknya tentang masalah dengan spasi dalam nama? (Juga, OP ingin pindah bukan menyalin )
Hagen von Eitzen
^^ Ya. Keduanya mencapai tujuan yang sama.
shivams
4

Jika Anda memiliki file yang lebih baru pada disk lama yang ingin Anda abaikan, saya akan melakukannya seperti ini

  1. Buat file penanda sementara dengan tanggal modifikasi yang memisahkan file yang saya inginkan dari yang saya tidak
  2. Salin file yang lebih lama dari file penanda ke lokasi baru

Berikut adalah contoh perintah untuk ini, yang menganggap Anda ingin mempertahankan hierarki direktori dari disk lama di disk baru ( cpioadalah perintah salin, mirip dengan taratau pax):

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
roaima
sumber
2

Saya pikir mungkin masalah ini sangat sama dengan Anda, Anda juga dapat memeriksanya: Membuat sub-direktori dan mengatur file berdasarkan tanggal

Saya menulis skrip baru ini berdasarkan jawaban pertama masalah itu:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. tulis skrip ini ke file yang bernama copy.shdi direktori lama Anda.

  2. ganti /your/new/directorydengan jalur direktori baru Anda

  3. buat file ini dapat dieksekusi dengan chmod +x copy.sh

  4. kemudian jalankan file ini dengan ./copy.sh

kehangatan
sumber
1
Anda mungkin ingin menambahkan beberapa penanganan pengecualian, sehingga skrip tidak memindahkan dirinya ke 2015direktori.
G-Man Mengatakan 'Reinstate Monica'
1

Anda mungkin harus menggunakan alat batch untuk operasi batch. Melakukannya biasanya akan mengharuskan membaca / menulis semua catatan dalam satu aliran daripada, misalnya, meminta cpproses terpisah untuk setiap file yang disalin.

Sudah ada cpiojawaban yang ditulis di sini, yang, mengingat hanya opsi yang sudah disediakan Anda kemungkinan besar akan saya pilih. Namun, cpioformat telah diperbaiki dan dilipat ke dalam paxformat arsip standar sejak masa kejayaannya. Hal yang sama berlaku untuk tar.

POSIX- yang ketat paxtidak akan memberikan opsi apa pun untuk secara langsung memfilter anggota arsip berdasarkan waktu modifikasi file - meskipun standar tidak menentukan %Tpengubah format daftar-mode. Namun, paximplementasi yang paling umum tersedia yang saya tahu - yang merupakan versi BSD dikelola oleh mirabilos - tidak memperluas ini menjadi CLI-switch yang dapat diakses secara langsung.

Misalnya, untuk menyalin hanya semua file di pohon yang di-root ./yang terakhir dimodifikasi sebelum ccyymmddHHMMdapat /target/dirAnda lakukan:

pax -rwT,201301010000 ./ /target/dir

Untuk menghindari pengulangan ke direktori anak, Anda dapat melakukannya:

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

Lihat manhalaman untuk lebih lanjut.

mikeserv
sumber
Saya kira saya benar-benar harus belajar pax, tapi tardan cpiomasih berdiri saya dengan baik. +1
roaima
@roaima - secara tegas, meskipun ada paxformat arsip aktual (yang merupakan perluasan ke format ustar ) , pax utilitas POSIX-spec'd membaca / menulis format cpio, pax, dan ustar. Karena ketiga jenis arsip terutama hanya untuk berbagai cara pengkodean metadata untuk banyak file bersama data aktual file tersebut ke dalam satu aliran, itu tidak terlalu berlebihan. Saya pernah menulis shitar- yang hanya beberapa baris skrip shell untuk - kebanyakan dd- tardev blok dengan cepat berdasarkan pada spesifikasi POSIX.
mikeserv
Saya suka skrip tertaut Anda; anehnya itu akan sangat berguna beberapa bulan yang lalu untuk tujuan yang persis sama. Baiklah. Saya bahkan mungkin mencoba untuk berhenti menggunakan cpio -H ustar...
roaima