Làm phẳng cấu trúc thư mục thành tên tệp trong Bash


4

Tôi đang cố gắng chuyển đổi tập tin từ cấu trúc này:

foldera/folderb/filec.png

đến:

foldera_folderb_filec.png

Tôi đang ở giữa chừng:

 find . -type f -name "*.png" | sed 's@^./@@g;s@/@-@g'

mà về cơ bản chuyển đổi cấu trúc tên. Tuy nhiên, nó không làm bản sao nào. Tại thời điểm này tôi bị mắc kẹt. Làm cách nào để mở rộng tập lệnh để thực sự thực hiện các thao tác sao chép?

Câu trả lời:


1

Điều này có thể làm việc cho bạn:

find . -type f -name "*.png" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh

woa thật tuyệt. Điều này về cơ bản hoạt động, ngoại trừ tất cả các tệp bắt đầu bằng '._'
phục hồi

1
find -type f -name '*.png' -printf '%P\0' | \
while read -d $'\0' i ; do cp "$i" "${i////_}" ; done

Ở đâu:

  • %Pnói findđể bỏ qua hàng đầu ./;

  • \0nói findđể in các đường dẫn sử dụng ASCII NULký tự làm dấu phân cách (điều này sẽ tránh các vấn đề với tên lạ );

  • -d $'\0'nói bashđể sử dụng dấu phân cách thích hợp để đọc các đường dẫn;

  • ${i////_}nói bashđể thay thế mọi lần xuất hiện /với _trong đường dẫn.

Cảnh báo:

Đường ống này có thể liên quan đến ghi đè tập tin, đảm bảo thực hiện các biện pháp phòng ngừa thích hợp.


tìm: tùy chọn bất hợp pháp - t. tìm: lựa chọn bất hợp pháp - y. tìm: lựa chọn bất hợp pháp - p. tìm: lựa chọn bất hợp pháp - e. tìm: -printf: unknown tùy chọn = (Tôi có nên nói với bạn tôi đang ở trên máy Mac không?
rebier 17/03 '

1

Điều này làm việc tốt cho tôi. Nó loại bỏ tiền tố ._, nhưng khác với câu trả lời của potong .

find . -type f -name "*" | sed 's/$/"/;s/^/"/;h;s/^...//;s/^/"/;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh

0

Một số câu trả lời tuyệt vời ở trên nhưng tôi cũng sẽ đặt câu hỏi của mình.

Điều này sẽ chỉ echora các mvlệnh:

find . -type f -exec sh -c 'for f do x=${f#./}; y="${x// /_}"; echo "mv ${x// /\ } ${y////-}"; done' {} +

Điều này sẽ chỉ echora các mvlệnh vào bảng của bạn trực tiếp:

find . -type f -exec sh -c 'for f do x=${f#./}; y="${x// /_}"; echo "mv ${x// /\ } ${y////-}"; done' {} + | pbcopy

[Cẩn thận] Điều này sẽ ngay lập tức chạy các mvlệnh cho bạn:

find . -type f -exec sh -c 'for f do x=${f#./}; y="${x// /_}"; eval "mv ${x// /\ } ${y////-}"; done' {} +
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.