Đổi tên nhiều thư mục


2

Nếu có cấu trúc thư mục lưu trữ các bản ghi dựa trên ngày ghi của chúng. Ban đầu có một thư mục chứa thư mục con cho mỗi ngày như thế này

  • dựa
    • 2010-01-01
      • nhiều tập tin và đôi khi thư mục con
    • 2010-01 / 02
    • ...
    • ...
    • 2014-12-15

Vì điều đó trở nên quá lớn đối với sự thoải mái, tôi quyết định thực hiện một số di chuyển xung quanh và kết thúc với điều này:

  • dựa
    • 2010
      • 01
        • 2010-01-01
        • 2010-01 / 02
        • ...
        • 2010-01-31
      • 02
        • 2010 / 02-01
        • 2010/02/02
        • ...
        • 2010 / 02-28
      • 03
      • ...
    • 2011
    • ...
    • 2014

Vì vậy, để có được dữ liệu ngày nay tôi sẽ tìm trong basedir/2014/12/2014-12-15/

Tôi muốn đổi tên tất cả các thư mục con đầy đủ ngày sao cho chúng chỉ có ngày trong tháng là tên. Ngày nay dữ liệu sẽ được đặt trong basedir/2014/12/15/.

Cách dễ dàng để đạt được điều này là gì?


Sau khi tìm kiếm xung quanh, tôi đã tạo ra một findregex đặc biệt cung cấp cho tôi các thư mục mà tôi đang tìm kiếm, do đó làm giảm sự thay đổi của mọi thứ.

find . -type d -regextype posix-extended -regex '.*/(20[0-9]{2})/(0[1-9]|1[0-2])/\1-\2-(0[1-9]|[1-2][0-9]|3[0-1])'

Câu trả lời:


3

Đây là một lót:

find -mindepth 3 -maxdepth 3 -type d | while read -r name; do
  mv -v "$name" "${name/????-??-}"; done

được thực hiện trong basedir.

Ngắt dòng chỉ để dễ đọc nhưng về mặt kỹ thuật nó là một lớp lót.

Tôi rất khuyên bạn nên tạo một bản sao lưu trước khi thực hiện. Lệnh này không kiểm tra độ tỉnh táo. Nó không an toàn để thực hiện trên cây tùy ý. Nó sẽ gây rối với các thư mục xảy ra có cùng một phần "ngày". Nó sẽ bị hỏng khi có khoảng trắng trong tên thư mục.

Nhưng đối với một lần chạy, trên dữ liệu mà bạn biết rằng tên tệp là lành mạnh, với bản sao lưu và xác minh thủ công sau đó, nó đủ an toàn để sử dụng, một lần.

Một "${name/????-??-}"phần là bash cụ thể. Nó có thể không hoạt động trên các vỏ khác. Nó được gọi là tìm kiếm và thay thế trong việc mở rộng tham số .


Tìm kiếm và thay thế trong việc mở rộng tham số là tốt đẹp! Tôi thấy những gì nó cố gắng làm, nhưng nó không hoạt động. Tôi đã thực hiện một thử nghiệm chỉ với một tệp: testdir / 2014/12 / 2014-12-15 / dummy.dat và nó phàn nàn về "Không có tệp hoặc thư mục như vậy". Để kiểm tra sự tỉnh táo hơn, giờ đây tôi đã tạo một biểu thức chính quy có vẻ hiệu quả, tôi sẽ thêm nó vào câu hỏi của mình.
DeltaLima

Khi tôi kết hợp chuỗi tìm kiếm của tôi với vòng lặp while của bạn, nó dường như hoạt động! Cảm ơn
DeltaLima

Tôi nghĩ rằng câu trả lời ban đầu sẽ có hiệu quả nếu anh ta đã sử dụng -type d. Nếu có khoảng trống trong các đường tìm thấy, nó sẽ cầnwhile name="$(line)"; do ...
AFH

Tôi đã cập nhật câu trả lời để phản ánh những thay đổi trong câu hỏi.
lesmana
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.