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)!
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? –
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