Bagaimana cara mencetak nama file yang hilang dalam folder?

8

Saya memiliki 2000+ file dalam satu folder, tetapi ada beberapa file yang hilang dari folder tersebut.

Seperti nama file

GLDAS_NOAH025SUBP_3H.A2003 001,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1800 .001.2015. 002.044609.pss.grb

001menunjukkan hari, sedangkan 0000jam.

Bagaimana cara mengetahui file yang hilang di folder? Saya mendapat beberapa jawaban di google tetapi tidak tahu bagaimana cara mengimplementasikannya.

Maria
sumber
Maksud Anda, setiap hari dari 001 ke xyz pasti ada 4 file: 0000, 0600, 1200 dan 1800? Dan jika tidak, nama itu harus dicetak? Apakah saya mengerti ini benar?
kekacauan
Di * nix, kami menyebutnya 'direktori', bukan folder. Folder adalah istilah Windows.
Rob
1
@chaos itu 001 hingga 365 & ya Anda mengerti maksud saya.
Maria
3
@Rob: meh. Kedua istilah tersebut dipahami dengan cukup baik. Sebenarnya, Apple mungkin muncul dengan metafora folder sekitar waktu rilis pertama MacOS sebelum MS Windows bahkan ada. Dan karena seperti yang kita semua tahu MacOS adalah UNIX, itu membuat folder istilah UNIX :-)
Celada
2
Folder dan direktori adalah metafora yang sangat berbeda. Dan direktori di Unix berperilaku sangat mirip dengan direktori di kehidupan nyata dan tidak seperti folder di kehidupan nyata, sedangkan folder di Windows berperilaku lebih mirip folder kehidupan nyata daripada direktori kehidupan nyata, sehingga masuk akal untuk menggunakan istilah yang lebih dekat menyerupai konsep kehidupan nyata yang sesuai. Saya pribadi melihat kehilangan data yang disebabkan oleh pengguna yang berpikir direktori berperilaku seperti folder karena gurunya terus memanggil mereka folder daripada direktori.
Jörg W Mittag

Jawaban:

13

Dengan zshatau bash4, Anda dapat menggunakan ekspansi brace untuk itu:

ls -d GLDAS_NOAH025SUBP_3H.A2003{001..006}.{0000,0600,1200,1800}.001.2015210044609.pss.grb >/dev/null

Perhatikan tanda kurung:

  • {001..006}cara memperluas untuk 001, 002...006
  • {0000,0600,1200,1800}ke setiap yang di atas 0000, tambahkan 0600,, 1200dan 1800.
  • >/dev/nulladalah untuk menghindari keluaran standar ls-> kita hanya ingin kesalahan standar

Sekarang jika satu file tidak ada, lsakan menunjukkan kesalahan untuk itu:

ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1800.001.2015210044609.pss.grb: No such file or directory

Dengan ksh93, ganti {001..006}dengan {1..6%.3d}.

kekacauan
sumber
2
Keren .... +1!
JJoao
Terima kasih tetapi ada 365 hari, jadi {001..006} tidak dapat diperluas ke tingkat itu dalam perintah. Apa yang harus dilakukan untuk ini?
Maria
3
@Maria Mengapa tidak, sudahkah Anda mencoba {001..365}, bagi saya itu berhasil
kekacauan
1
Lihat juga {0000..1800..600}formulirnya.
Stéphane Chazelas
Anda tidak benar-benar membutuhkan menit dalam daftar. Perluasan brace kedua bisa saja .{00,06,12,18}00..
WAF
7

Variasi pada solusi @chaos (bash 4.0 atau lebih tinggi atau zsh 4.3.11 dan lebih tinggi):

for a in GL.....2003{001..365}.{00..18..6}00.001.2015210044609.pss.grb 
do  
  [[ -f $a ]] || echo "$a"
done

atau

for a in {001..365}.{00..18..6}
do
  [[ -f "GL.....2003${a}00.001.2015210044609.pss.grb" ]] || echo "$a"
done

untuk mencetak hanya hari + jam yang hilang

Joao
sumber
4

Walaupun jawaban chaos baik untuk digunakan dalam shell interaktif, jawaban ini dapat digunakan sebagai skrip POSIX, misalnya jika Anda perlu melakukan ini secara berkala dan / atau melakukannya di komputer lain.

#!/bin/sh
i=0
while test "$((i+=1))" -lt 366 ; do
    for j in 00 06 12 18 ; do
        file="GLDAS_NOAH025SUBP_3H.A2003$(printf '%03d' "$i").${j}00.001.2015210044609.pss.grb"
        test -e "$file" || echo "$file"
    done
done

( seqatau ekspansi penjepit tidak ditentukan oleh POSIX.)

Mikhal
sumber
2

Buat nama file dalam satu lingkaran dan kemudian uji untuk tidak adanya file:

for day in `seq -f "%03g" 1 30`
  do
  for hour in 0000 0600 1200 1800
    do
    filename="GLDAS_NOAH025SUBP_3H.A2003${day}.${hour}.001.2015210044609.pss.grb"
    if [[ ! -e $filename ]]
    then
      echo "File missing: $filename"
    fi
  done
done

Catatan: Saya tidak menjamin contoh ini bebas dari kesalahan. Ini adalah contoh, bukan skrip yang diketahui bekerja.

Portabilitas: kebutuhan ksh, bashatau zshdan sistem dengan seqperintah GNU tersedia.

John
sumber
Konsepnya yang saya konvergen juga, tetapi harap dicatat bahwa sangat sedikit bulan Julian yang memiliki 30 hari.
WAF