2012-09-25 30 views
6

Tôi đang cố sao chép tất cả các tệp từ một thư mục này sang một thư mục khác, đồng thời xóa tất cả tiện ích mở rộng tệp.Làm cách nào để sử dụng tính năng tìm kiếm để sao chép và xóa tiện ích giữ cùng cấu trúc thư mục con

From directory 0001: 
0001/a/1.jpg 
0001/b/2.txt 

To directory 0002: 
0002/a/1 
0002/b/2 

Tôi đã thử tìm một số ... | xargs c ... p không có may mắn.

+0

hành vi sẽ là gì nếu có hai tệp (ví dụ: 1.txt và 1.jpg) trong cùng thư mục có cùng tên bên cạnh tiện ích mở rộng? –

+0

tất cả tên tệp được thêm vào trước bởi một id duy nhất để không có nguy cơ đặt tên va chạm. – user1345178

Trả lời

4

Các bản sao đệ quy thực sự dễ dàng với tar. Trong trường hợp của bạn:

tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . | 
tar -C 0002 -xf - 
+0

+1 - bạn nên thay đổi regex: loại bỏ mọi tiện ích mở rộng, không chỉ jpg (OP yêu cầu) - mà còn là giải pháp tốt. – kobame

+1

regex mới này gần như là ok, nhưng điều gì sẽ làm điều này ví dụ với tên tệp ".profile"? – kobame

+0

Giải pháp tốt. Thử nghiệm với 260000 tập tin (4 giờ). – user1345178

0

tôi đến với vịt con xấu xí này:

find 0001 -type d | sed 's/^0001/0002/g' | xargs mkdir 
find 0001 -type f | sed 's/^0001//g' | awk -F '.' '{printf "cp -p 0001%s 0002%s\n", $0, $1}' | sh 

Dòng đầu tiên tạo ra cây thư mục, và các bản sao dòng thứ hai các tập tin. Vấn đề với điều này là:

  1. Có chỉ xử lý cho các thư mục và các tập tin thường xuyên (không liên kết tượng trưng vv)
  2. Nếu có bất kỳ dấu chấm câu (ngoài phần mở rộng ) hoặc các ký tự đặc biệt (số lượng, vv) trong tên tập tin thì lệnh thứ hai sẽ không hoạt động.
2

Nếu bạn chưa tar với --transform này có thể làm việc:

TRG=/target/some/where 
SRC=/my/source/dir 
cd "$SRC" 
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" |\ 
    sed 's:/\.::;s:/./:/:' |\ 
    xargs -I% sh -c "%" 

Không có dấu cách sau \, cần thúc đơn giản của dòng, hoặc bạn có thể đưa nó vào một dòng như:

find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" | sed 's:/\.::;s:/./:/:' | xargs -I% sh -c "%" 

Giải thích:

  • các find sẽ tìm thấy tất cả file plain gì có phần mở rộng trong bạn SRC (nguồn) thư mục
  • của printf sẽ chuẩn bị các lệnh shell cần tìm:
    • lệnh cho tạo cây thư mục cần thiết ở TRG (mục tiêu dir)
    • lệnh để sao chép
  • các sed làm một số làm sạch con đường thẩm mỹ, (như sửa chữa /some/path/./other/dir)
  • các xargs sẽ mất toàn bộ dòng
  • và thực thi các lệnh chuẩn bị với vỏ

Tuy nhiên, nó sẽ tốt hơn nhiều:

  • chỉ cần thực hiện một chính xác bản sao trong 1 bước
  • đổi tên tệp ở bước 2

dễ dàng hơn, sạch hơn và nhanh hơn (không cần c hecking/tạo các subdir mục tiêu)!

+0

Tôi quan tâm đến cách tiếp cận 2 bước vì thư mục chứa khoảng 1000000 tệp. FASTER là vua. – user1345178

+0

Tệp Milion? Vì vậy, trong trường hợp này (IMO), hai đường ống nhựa là giải pháp tốt nhất. Nếu bạn không có tar với --transform, hãy tải xuống và biên dịch. Nó chắc chắn sẽ nhanh hơn so với bắt đầu lệnh cp milion. – jm666

1

Dưới đây là một số find + bash + cài đặt sẽ làm các trick:

for src in `find 0001 -type f` # for all files in 0001... 
do 
    dst=${src/#0001/0002}   # match and change beginning of string 
    dst=${dst%.*}     # strip extension 
    install -D $src $dst   # copy to dst, creating directories as necessary 
done 

Điều này sẽ thay đổi chế độ cho phép của tất cả các file sao chép vào rwxr-xr-x theo mặc định, thay đổi với cài đặt của --mode tùy chọn.

+0

+1 cho điều này, tôi chuẩn bị viết câu trả lời như vậy. Thanh lịch nhất ở đây và công cụ thích hợp :) – Zlatko

Các vấn đề liên quan