Sử dụng mở rộng tham số để tạo danh sách đối số cho `mkdir -p`


10

Tôi có một cái gì đó như thế này:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

Tôi muốn tạo một thư barmục theo từng thư mục con bên dưới foo.

Nếu tôi cố gắng làm điều này với

% mkdir -p /tmp/foo/*/bar

... Tôi nhận được lỗi

zsh: no matches found: /tmp/foo/*/bar

(Nhìn nhận lại, tôi có thể hiểu lý do của lỗi.)

Tôi biết rằng tôi có thể giải quyết vấn đề ban đầu bằng một vòng lặp for, nhưng tôi tò mò muốn biết liệu có zshhỗ trợ một số dạng mở rộng tham số sẽ tạo ra đối số mong muốn cho một lần gọi hay không mkdir -p. IOW, một mở rộng tham số tương đương với "nối /barvào mọi tiền tố được tạo bằng cách mở rộng /tmp/foo/*", dẫn đến

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

Câu trả lời:


13
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

Này được mở rộng globbing mà có một quiet glob cờ mà sử dụng một vòng glob để phù hợp với chỉ danh bạ và sửa đổi để thực hiện một substitution (sử dụng %nhân vật mẫu mà chỉ có sẵn trong mẫu thay thế lịch sử chế độ) mà gắn thêm một chuỗi để mỗi từ.

man zshexpn

Ồ, tôi rất ấn tượng. Tôi thậm chí đã tìm thấy tất cả trong trang người đàn ông bạn chỉ định.
tự đại diện

1
Lưu ý rằng Poster gốc được chỉ định mkdir -p, sẽ có hiệu ứng hơi khác so với lệnh không ném lỗi nếu một số barthư mục đó đã có thư mục con. Điểm nhỏ nhưng đáng chú ý ở đây. :)
tự đại diện

1
Một cách khác là sử dụng mở rộng mảng thông qua ${^spec}và nối thêm barvào từng phần tử của bất kỳ thứ gì /tmp/foo/*(/)mở rộng thành: set -- /tmp/foo/*(/)sau đómkdir -p -- "${^@}/bar"
don_crissti

5

Chắc chắn - sử dụng một vòng lặp

for n in /tmp/foo/*; do mkdir "$n/bar";done

quả cầu được sử dụng để mở rộng danh sách các mục hiện có , không phải những thứ chưa được tạo.


Xin lỗi, tôi sợ câu hỏi của tôi không được nêu rõ ràng. Tôi sẽ làm rõ nó.
kjo

2
Điều này không trả lời nếu zshcó thể mở rộng các khối và nối thêm văn bản với một cú pháp duy nhất nhưng tôi nghĩ đó có thể là cách duy nhất để làm những gì bạn muốn, @kjo.
tự đại diện

4

Nếu các thư mục nằm trong một mảng, bạn có thể sử dụng ${^...}hình thức mở rộng.

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

0

Bạn có thể sử dụng findxargsđể làm điều đó:

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

trong đó sử dụng -maxdepth 1-mindepth 1để ngăn chặn việc tạo ra các barthư mục con của các mục tiêu và /tmp/foobản thân nó tương ứng. type dlàm cho nó chỉ xem xét các thư mục.

Bạn phải loại bỏ echođể thực hiện các hành động thực tế, nếu không echosẽ chỉ in ra các dòng để thực thi. Bạn cũng có thể gửi nó thay thế như muốn $()thực hiện nó.

Hướng dẫn sử dụng nói xargs -ibị phản đối, nhưng tôi thấy không có sự thay thế không kém tiện dụng khác, vì vậy nó nên vẫn làm việc cho một số năm ... Bạn có thể thay thế -ivới -I'{}'tới được up-to-date với điều đó.


Câu trả lời này và câu tiếp theo có vẻ tốt với tôi. Ai đó có thể giải thích tại sao họ nên bỏ phiếu? Bỏ phiếu là tốt, nhưng làm thế nào chúng ta có thể tìm hiểu nếu không có lý do được đưa ra?
Joe

Nó là một giải pháp thay thế không làm gì ngoài những gì OP yêu cầu. Đánh bại tôi
loa_in_

Tôi nghĩ rằng đó là một sự thiên vị nào đó mà câu trả lời phải có câu trả lời không hay về họ, vì vậy định kiến ​​đã ảnh hưởng đến danh tiếng của tôi.
loa_in_

Tôi không thích những phiếu bầu không giải thích được, nhưng tôi chưa thấy bất kỳ sự thiên vị nào như vậy. Thông thường, câu trả lời "xấu" (những câu mà tôi hiểu) thực sự xấu.
Joe

0

@loa_in_ có hầu hết, nhưng findđầu ra đường ống có xu hướng là một pas giả.

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

Tôi chỉ sử dụng xargsvới các công cụ khác nhau không có công cụ -execthay thế, vì vậy tôi sử dụng phương pháp của mình vì nó hoạt động với tất cả chúng.
loa_in_
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.