Làm thế nào để in tên của các tập tin bị thiếu trong một thư mục?


8

Tôi có hơn 2000 tệp trong một thư mục, nhưng có một vài tệp bị thiếu trong thư mục.

Tên của các tập tin là như thế

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.2015210044609.pss.grb

001chỉ ngày, trong khi 0000là giờ.

Làm thế nào để tìm ra tập tin nào bị thiếu trong thư mục? Tôi có một vài câu trả lời trong google nhưng không thể tìm ra cách thực hiện chúng.


Ý bạn là, mỗi ngày từ 001 đến xyz phải có 4 tệp: 0000, 0600, 1200 và 1800? Và nếu không phải tên đó nên được in? Tôi có hiểu điều này đúng không?
hỗn loạn

Trong * nix, chúng tôi gọi chúng là 'thư mục', không phải thư mục. Thư mục là một thuật ngữ Windows.
Rob

1
@chaos là 001 đến 365 và vâng, bạn hiểu ý tôi rồi.
Maria

3
@Rob: meh. Cả hai thuật ngữ đều được hiểu khá rõ. Trên thực tế, Apple có thể đã đưa ra phép ẩn dụ thư mục vào khoảng thời gian phát hành MacOS đầu tiên trước khi MS Windows thậm chí còn tồn tại. Và vì như chúng ta đều biết MacOS là UNIX, điều đó làm cho thư mục trở thành một thuật ngữ UNIX :-)
Celada

2
Thư mục và thư mục là những ẩn dụ rất khác nhau, mặc dù. Và các thư mục trong Unix hoạt động rất giống các thư mục trong đời thực và không giống như các thư mục trong đời thực, trong khi các thư mục trong Windows hoạt động giống như các thư mục trong đời thực hơn các thư mục trong đời thực, do đó, nên sử dụng thuật ngữ này chặt chẽ hơn giống với khái niệm đời thực tương ứng. Cá nhân tôi đã thấy mất dữ liệu do thư mục suy nghĩ của người dùng hành xử giống như các thư mục vì giáo viên của anh ta cứ gọi chúng là thư mục thay vì thư mục.
Jörg W Mittag

Câu trả lời:


13

Với zshhoặc bash4, bạn có thể sử dụng mở rộng cú đúp cho điều đó:

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

Lưu ý các dấu ngoặc:

  • {001..006}phương tiện mở rộng ra 001, 002...006
  • {0000,0600,1200,1800}để mỗi một trong những add ở trên 0000, 0600, 12001800.
  • >/dev/nulllà để tránh đầu ra tiêu chuẩn của ls-> chúng tôi chỉ muốn lỗi tiêu chuẩn

Bây giờ nếu một tệp không có mặt, lssẽ hiển thị lỗi cho điều đó:

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

Với ksh93, thay thế {001..006}bằng {1..6%.3d}.


2
Thật tuyệt .... + 1!
JJoao 29/07/2015

Cảm ơn nhưng có 365 ngày, vì vậy {001..006} không thể được mở rộng đến mức đó trong lệnh. Làm gì cho việc này?
Maria

3
@Maria Tại sao không, bạn đã thử chưa {001..365}, đối với tôi nó hoạt động
hỗn loạn

1
Xem thêm {0000..1800..600}hình thức.
Stéphane Chazelas

Bạn không thực sự cần những phút trong danh sách. Việc mở rộng cú đúp thứ hai có thể chỉ là .{00,06,12,18}00..
WAF

7

Một biến thể của giải pháp @chaos (bash 4.0 trở lên hoặc zsh 4.3.11 trở lên):

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

hoặc là

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

chỉ in ngày thiếu + giờ


4

Mặc dù câu trả lời của hỗn loạn là tốt để được sử dụng trong các vỏ tương tác, nhưng câu trả lời này có thể được sử dụng như một tập lệnh POSIX, ví dụ nếu bạn cần thực hiện việc này định kỳ và / hoặc thực hiện trên các máy tính khác.

#!/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

( seqhoặc mở rộng cú đúp không được chỉ định bởi POSIX.)


2

Xây dựng tên tệp trong một vòng lặp và sau đó kiểm tra sự không tồn tại của tệp:

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

Lưu ý: Tôi không đảm bảo ví dụ này không có lỗi. Đây là một ví dụ, không phải là một kịch bản làm việc được biết đến.

Khả năng di chuyển: nhu cầu ksh, bashhoặc zshvà một hệ thống với GNU seqlệnh sẵn.


Khái niệm này cũng là khái niệm mà tôi đã hội tụ, nhưng xin lưu ý rằng rất ít tháng Julian có 30 ngày.
WAF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.