Làm thế nào để đổi tên tập tin trong khi sao chép?


12

Làm cách nào để sao chép (kiểu lưu trữ trong đó ngày không thay đổi) tất cả các tệp trong thư mục sao lưu vào thư mục của người dùng trong khi đổi tên từng tệp để xóa phần chuỗi ngẫu nhiên khỏi tên (ví dụ: -2b0fd460_1426b77b1ee_-7b8e)?

cp từ:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

đến:

/home/user/data/Erp.2014.02.16_16.57.03.etf

Mỗi tệp sẽ luôn bắt đầu bằng "Erp." theo sau là chuỗi tem thời gian theo sau là chuỗi ngẫu nhiên và sau đó là phần mở rộng ".etf". Tôi muốn giữ tất cả các yếu tố tên bao gồm cả dấu thời gian. Tôi chỉ muốn loại bỏ chuỗi ngẫu nhiên.

Chuỗi ngẫu nhiên cho phép nhiều bản sao lưu của cùng một tệp. Tuy nhiên, trong trường hợp này, tôi chỉ chạy fdupes và không có bản sao. Vì vậy, tôi chỉ có thể khôi phục tất cả các tệp, loại bỏ chuỗi ngẫu nhiên.

Tôi đang tìm kiếm một lệnh bash một dòng để làm điều đó.

Nếu điều đó không hiệu quả, tôi có thể làm điều đó trong hai hoặc nhiều bước. Tôi thường sử dụng KRename, nhưng trong trường hợp này tôi cần phải làm điều đó trong bash. (Tôi đang làm việc từ xa.)

Câu trả lời:


7

paxcó thể làm tất cả điều này cùng một lúc. Bạn có thể làm:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxbảo toàn thời gian theo mặc định, nhưng có thể thêm -peđể bảo toàn mọi thứ (được thực hiện tốt nhất dưới dạng root) hoặc -ppđể giữ quyền, ví dụ:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

Mặt khác ( paxthường không có sẵn theo mặc định), chắc chắn tốt hơn là thực hiện một bản sao sau đó rename:

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

Bằng cách này, không có một quy trình khác nhau được bắt đầu cho mỗi tệp.


1
Tôi có thể thấy rằng tôi cần phải làm quen với pax. Đây trông giống như một công cụ rất hữu ích. Làm cho tôi tự hỏi tại sao nó không phải là tiêu chuẩn trong các bản phát hành khác ...
MountainX

@MaxX, Câu hỏi hay, theo Wikipedia, paxđã có trong Cơ sở Tiêu chuẩn Linux từ năm 2005. Ngoài ra, GNU cpiosẽ là công cụ GNU ít tính năng nhất tồn tại.
Graeme

1
+1 cho giải pháp cuối cùng của bạn và Cách này không có quy trình khác nhau được bắt đầu cho mỗi tệp. Nhưng rename khác với Fedora / Red Hat: Tôi không biết cách sử dụng nó trong trường hợp này.
erik

15

Bạn có thể sử dụng cplệnh với -atùy chọn

-a, --archive
       same as -dR --preserve=all

Và sau đó sử dụng vòng lặp for để đổi tên tất cả các tệp trong khi sao chép chúng:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

Sẵn sàng. Bắt đầu lệnh này trong thư mục nguồn.

Giải thích: Các %%-*sẽ cắt đứt tất cả các nhân vật sau khi xuất hiện đầu tiên của một gạch nối / trừ -.etfcuối cùng lại thêm phần mở rộng tập tin.

Vâng, và như một lớp lót, đặt tất cả trong một dòng. :-) Như thế này

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
Cảm ơn, bạn có thể vui lòng trích dẫn các tài liệu cho tiền %%-*boa? Tôi tò mò.
Soyuka

3

Trong zsh, sử dụng zmv. Đặt cái này trong .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

Sau đó sử dụng

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Trong bash:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Nếu bạn không có zsh, cách POSIX sẽ sử dụng pax (thư mục này sao chép theo cách đệ quy).

Nếu bạn đang ở trong một hệ thống bị hạn chế không có zsh và không có pax, bạn có thể sử dụng một vòng lặp:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cpkhông có khả năng đó. Tôi nhớ cpiolà có thể làm điều đó, nhưng trang hiện tại nói khác. Tuy nhiên, (gnu) tarkhông có --transformtùy chọn:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

Vì vậy, bạn có một cmdline như:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
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.