Liệt kê tất cả các thư mục có nội dung (tệp) chưa được cập nhật hoặc truy cập trước một ngày nhất định?


0

Muốn dễ dàng định vị các thư mục để lưu trữ / thùng rác và một cách dễ dàng để tự động hóa việc này sẽ là chọn các thư mục mà tôi đã không sử dụng trong nhiều năm. Vì bản thân các thư mục có thể có các ngày sửa đổi khác với các tệp mà chúng chứa, tôi tự hỏi liệu đã có lệnh * nix thực hiện điều này cho tôi chưa.

Mặt khác, tôi cho rằng tôi có thể viết một tập lệnh xác định vị trí các thư mục chưa được cập nhật hoặc truy cập trước một ngày nhất định và sau đó lặp lại qua nội dung của chúng để đảm bảo chúng cũng không được truy cập hoặc sửa đổi kể từ ngày đó.

Nhưng nếu một công cụ như thế này đã tồn tại, tôi không muốn phát minh lại bánh xe.

Câu trả lời:


1
find /some/where -type d \( -atime +1234 -o -mtime +1234 \) -print | ...

Lưu ý rằng câu trả lời này hoạt động, nhưng chỉ bởi vì, trong osx ít nhất, dường như mỗi lần một tệp được truy cập, tạo hoặc sửa đổi, thời gian truy cập cho mỗi thư mục con chính của nó cũng được cập nhật. Có lẽ chỉ cần atimebộ lọc là cần thiết, tôi không thể nghĩ về bất kỳ tình huống nào mà một thư mục sẽ được sửa đổi nhưng không được truy cập.
Jordan Reiter

1

Thời gian truy cập trên một thư mục hiếm khi hữu ích. Lần đầu tiên bạn chạy lshoặc findtrong thư mục, thời gian truy cập của nó được cập nhật.

Bạn có thể chỉ cần tìm các tệp không được truy cập trong một thời gian dài:

find . -type f -atime +999 -print

Nếu bạn chỉ quan tâm đến các thư mục trong đó không có tệp nào được truy cập trong một thời gian dài, bạn có thể kết hợp một findlệnh để khám phá các thư mục và một findlệnh để khám phá các tệp trong một thư mục.

find . -type d -exec sh -c '
    recent=$(find "$0" -mindepth 1 -maxdepth 1 ! -type f -atime +999 -print | head -n 1)
    if [ -z "$recent" ]; then printf %s\\n "$0"; fi
  ' {} +

Lưu ý rằng đoạn mã này có thể in ra một thư mục trong đó không có tệp thông thường nào được truy cập gần đây nhưng có những tệp đã được truy cập gần đây. Bỏ qua những điều này không dễ dàng với findmột mình, trừ khi bạn chỉ cần loại bỏ các -maxdepth 1thư mục đi qua một cách độc lập sẽ gây ra nhiều hoạt động đĩa lặp lại. Đây là một tập lệnh bash chưa được kiểm tra giúp thư mục đi theo cách thủ công, theo dõi những thư mục nào chỉ chứa các tệp không được truy cập gần đây.

#!/bin/bash
shopt -s dotglob
explore () {
  local entry keep=
  for entry in "$1/"*; do
    if [ -L "$entry" ]; then
      :
    elif [ -d "$entry" ]; then
      if explore "$entry"; then
        keep=1  # Keep this directory, it contains kept directories
      fi
    elif [ -f "$entry" ]; then
      if [ -z "$(find "$entry" -atime +999 -print)" ]; then
        keep=1  # Keep this directory, it contains a recently-accessed file
      fi
    fi
  done
  if ((!keep)); then
    echo "$1"
    return 1
  fi
  return 0
}
explore .
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.