Bagaimana saya bisa mendaftar file yang tidak ada symlink?

10

Saya memiliki direktori "myfiles" besar yang penuh dengan dokumen lain-lain dan tidak ingin mengubah strukturnya.

Karena itu saya membuat (beberapa) direktori lain untuk setiap kelas dokumen. Sebagai contoh, saya memiliki "gambar" direktori yang memiliki symlink untuk setiap .jpgatau .cr2file dalam "myfiles" direktori ditambah file deskriptif lain untuk setiap symlink (dengan nama file yang sama) dengan deskripsi dan metadata lainnya. Symlinks di direktori / images mungkin memiliki nama yang berbeda dari file tertaut asli.

Saya mencoba menemukan cara paling sederhana untuk memastikan setiap dan semua file gambar dalam direktori "myfiles" memiliki symlink ke direktori "gambar".

Lihat contoh struktur folder

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

harus menghasilkan

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2
Robert Alexander
sumber
Bukan jawaban lengkap tetapi Anda bisa menyimpan hasil dari suatu find /myfiles -type ffile kemudian gunakan find /images -type l -exec readlink {} \; | egrep myfilesuntuk mendapatkan daftar file yang disinkronkan /imageskemudian beralih pada hasil yang dilakukan sedpada masing-masing untuk menghapus path di file pertama yang Anda simpan karena mereka sudah memiliki symlink dan file yang tersisa adalah file yang tidak memiliki symlink.
Bratchley
2
Apakah mungkin bagi Anda untuk menggunakan hardlink, jadi Anda dapat menggunakan penghitung hardlink untuk melihat apakah Anda memiliki tautan? Menggunakan ls -lAnda dapat melihat jumlah hardlink di kolom kedua.
Lambert
Lakukan apa yang dikatakan @Lambert. rmdir symlink tersebut dan gunakan pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dirmisalnya untuk mendapatkan hardlink dengan nama file yang diubah secara terprogram hanya untuk mereka yang file yang cocok dengan jpg Anda. Anda bisa mendapatkan lebih banyak dari itu - seperti batching berdasarkan waktu perubahan dan lain
mikeserv

Jawaban:

6

Jika saya menggarisbawahi pertanyaan dengan benar, Anda memerlukan file di file saya yang tidak memiliki symlink dalam gambar:

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

Ada peringatan dengan pendekatan ini jika Anda memiliki file a.jpg di direktori myfiles / 1 dan Anda memiliki symlink ke file tersebut di direktori images / 3 atau hanya dalam gambar / file tidak akan dilaporkan dengan symlink yang hilang.

taliezin
sumber
Terima kasih! Ya Anda memang mengerti benar. Tutup tetapi tidak cukup. Kesalahan saya bukan milik Anda :-) Contoh yang saya berikan menunjukkan direktori myfiles sederhana. Pada kenyataannya file gambar di bawah file myfile dapat berada di dalam setiap direktori direktori bersarang.
Robert Alexander
Saya mengedit jawaban untuk mencari di seluruh file saya, tetapi periksa apakah ini yang Anda inginkan.
taliezin
HAMPIR di sana :-) Skrip Anda tersendat ketika file memiliki spasi (dan mungkin omong kosong lain seperti apostrof "di dalamnya ...
Robert Alexander
Saya pikir sekarang itu harus baik-baik saja
taliezin
Modifikasi terakhir Anda membagi setiap f pada kemunculan setiap huruf n! :-) Saya menggunakan baris IFS ke IFS = lalu baris baru dari keyboard lalu yang lain ". Sekarang perpecahan tampaknya bekerja tetapi saya mendapatkan urutan panjang" missinglinks.sh: 11: missinglinks.sh: [[: tidak ditemukan "
Robert Alexander
3

Saya berasumsi bahwa file-file di bawah myfilesbukanlah tautan simbolis, dan tidak ada nama file yang mengandung baris baru. (Pendekatan saya masih bisa berfungsi jika asumsi-asumsi ini dilanggar tetapi semakin rumit.) Saya juga berasumsi bahwa Anda memiliki readlinkutilitas umum dan mendukung -fjalan kanonik, yang merupakan kasus di Linux (baik GNU dan BusyBox), tetapi tidak pada mis OSX.

Buat daftar file, dan urutkan untuk ukuran yang baik:

find /myfiles -type f -print | sort >all.list

Buat daftar target tautan simbolik, dengan jalur absolut.

find /images -type f -exec readlink -f {} \; | sort >linked.list

Daftar file yang tidak ditautkan:

comm -32 all.list linked.list

Jika Anda menggunakan shell yang mendukung substitusi proses, Anda bisa memasukkan semuanya dalam satu perintah:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

Jika tautan di bawah /imagesadalah mutlak, Anda dapat menggunakan readlinktanpa -fopsi, yang tersedia di * BSD dan OSX.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya akan memposting sesuatu seperti commperintah Anda, tetapi sekarang saya tidak akan melihat Anda sudah melakukannya. Namun, pengalihan dari sorttidak masuk akal; maka proses substitusi tidak akan menghasilkan apa-apa. Selain itu, Anda dapat menambahkan banyak direktori di sebelahnya /imagesjika Anda ingin menemukan file /myfilesyang tidak disinkronkan dari salah satu dari sejumlah direktori di samping /images.
tripleee
1
Lihat stackoverflow.com/questions/7665/… untuk alternatifreadlink -f
tripleee
@ tripleee Saya lupa mengeluarkan pengalihan ketika saya membangun versi pengalihan proses, terima kasih. Ya, Anda dapat dengan mudah menambahkan direktori lain atau membuat variasi lainnya.
Gilles 'SANGAT berhenti menjadi jahat'