Di chuyển tệp theo ngày vào thư mục khác bằng CLI


9

Tôi có một số lượng lớn hình ảnh từ một ổ cứng cũ mà tôi đang cố gắng tổ chức. Nếu tôi chạy ls -l, tôi nhận thấy tất cả các tệp này có ngày tạo là 2012 hoặc trước đó. Lý tưởng nhất là tôi muốn chuyển chúng sang ổ cứng thứ hai của máy tính, không được đặt tự động. Tốt hơn là, tôi có thể làm tất cả điều này như một đợt với một số lệnh được liên kết với nhau. Cho đến nay, tôi ls -l | grep -i 2012chỉ phát ra các tệp với năm 2012 vào ngày được cung cấp bởi ls -l. Bây giờ, mẹo sẽ là cp'đưa tất cả các tệp đó vào thư mục mới. Tôi không chắc sẽ đi đâu tiếp theo với điều này bởi vì mỗi tệp sẽ phải được sao chép. Điều gì sẽ là bộ lệnh tiếp theo của tôi?

Câu trả lời:


13

Không sử dụng ls. Không nên sử dụng trong những trường hợp như vậy. Hơn nữa, sử dụng grepđể lọc theo ngày không phải là một ý tưởng tốt. Tên tệp của bạn có thể chứa 2012chuỗi, mặc dù nó không được sửa đổi vào năm 2012.

Sử dụng findlệnh và đường ống đầu ra của nó.

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

Đây,

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 

1
Sẽ không `-exec mv {} / your / target / thư mục \; ' thay vì '-print 0 | xargs -0 cp -t / your / target / thư mục 'hoạt động tốt như các vấn đề với khoảng trắng trong tên? (Ngoài ra, OP muốn di chuyển không sao chép )
Hagen von Eitzen

^^ Vâng Cả hai đều đạt được cùng một mục tiêu.
shivams

4

Nếu bạn có các tệp mới hơn trên đĩa cũ mà bạn muốn bỏ qua tôi sẽ chuyển sang nó như thế này

  1. Tạo một tệp đánh dấu tạm thời với một ngày được sửa đổi để phân tách các tệp tôi muốn với những tệp tôi không
  2. Sao chép các tệp cũ hơn tệp đánh dấu vào vị trí mới

Dưới đây là các lệnh mẫu cho điều này, giả sử bạn muốn duy trì bất kỳ hệ thống phân cấp thư mục nào từ đĩa cũ trong mới ( cpiolà lệnh sao chép, tương tự tarhoặc pax):

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk

2

Tôi nghĩ có lẽ vấn đề này rất giống với bạn, bạn cũng có thể kiểm tra vấn đề này: Tạo thư mục con và sắp xếp các tệp theo ngày

Tôi viết kịch bản mới này dựa trên câu trả lời đầu tiên của vấn đề đó:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. viết tập lệnh này vào một tập tin có tên copy.shtrong thư mục cũ của bạn.

  2. thay thế /your/new/directorybằng đường dẫn thư mục mới của bạn

  3. làm cho tập tin này thực thi với chmod +x copy.sh

  4. sau đó thực hiện tệp này bằng cách ./copy.sh


1
Bạn có thể muốn thêm một số xử lý ngoại lệ, vì vậy tập lệnh không tự di chuyển vào một 2015thư mục.
G-Man nói 'Phục hồi Monica'

1

Bạn có thể nên sử dụng một công cụ hàng loạt cho các hoạt động hàng loạt. Làm như vậy thường sẽ đòi hỏi phải đọc / ghi tất cả các bản ghi trong một luồng chứ không phải, ví dụ, gọi một cpquy trình riêng cho mỗi tệp được sao chép.

Đã có một cpiocâu trả lời được viết ở đây, trong đó, chỉ đưa ra các tùy chọn đã cung cấp cho bạn có khả năng là những gì tôi sẽ chọn. Tuy nhiên, cpiođịnh dạng đã được cải thiện và gấp lại thành paxđịnh dạng lưu trữ được tiêu chuẩn hóa kể từ thời hoàng kim. Điều tương tự cũng đúng tar.

POSIX- hoàn toàn paxkhông có khả năng cung cấp bất kỳ tùy chọn nào để lọc trực tiếp các thành viên lưu trữ dựa trên thời gian sửa đổi tệp - mặc dù tiêu chuẩn chỉ định công cụ %Tsửa đổi định dạng chế độ danh sách. Tuy nhiên, cách paxtriển khai phổ biến nhất mà tôi biết - đó là phiên bản BSD được duy trì bởi mirabilos - sẽ mở rộng điều này thành một công tắc CLI có thể truy cập trực tiếp.

Ví dụ: chỉ sao chép tất cả các tệp trong cây ./đã được sửa đổi lần cuối trước đó ccyymmddHHMMđể /target/dirbạn có thể làm:

pax -rwT,201301010000 ./ /target/dir

Để tránh đệ quy vào các thư mục con, bạn có thể làm thay vào đó:

pax -rwdT,201301010000 ./* /target/dir

Xem mantrang để biết thêm.


Tôi đoán tôi thực sự nên học hỏi pax, nhưng tarcpiovẫn đứng tốt cho tôi. +1
roaima

@roaima - nói đúng ra, trong khi có một paxđịnh dạng lưu trữ thực tế (là phần mở rộng cho định dạng ustar ) , pax tiện ích POSIX-spec'd đọc / ghi các định dạng cpio, pax và ustar. Bởi vì cả ba loại lưu trữ chủ yếu chỉ dựa vào các phương tiện mã hóa siêu dữ liệu khác nhau cho nhiều tệp cùng với dữ liệu thực tế của các tệp đã nói thành một luồng, nên nó không thực sự quá căng. Tôi đã từng viết shitar- đó chỉ là một vài dòng shell-script cho - chủ yếu dd- taring các nhà phát triển khối đang hoạt động dựa trên thông số POSIX.
mikeerv

Tôi thích kịch bản được liên kết của bạn; kỳ lạ là nó sẽ rất hữu ích một vài tháng trước cho cùng một mục đích. Ồ tốt Tôi thậm chí có thể cố gắng ngừng sử dụng cpio -H ustar...
roaima
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.