Có một vài cách để giải quyết việc này, tùy thuộc vào việc bạn cần phải lo lắng về các file có khoảng trắng hoặc ký tự đặc biệt khác trong tên của họ.
Nếu không có tên tệp nào có dấu cách hoặc ký tự đặc biệt (chúng chỉ bao gồm chữ cái, số, dấu gạch ngang và dấu gạch dưới), thì sau đây là giải pháp đơn giản sẽ hoạt động. Bạn có thể sử dụng $(command)
để thực thi lệnh và thay thế kết quả vào đối số của lệnh khác. Trình bao sẽ chia kết quả trên dấu cách, tab hoặc dòng mới và for
gán mỗi giá trị cho $f
lần lượt và chạy lệnh trên mỗi giá trị.
for f in $(find . -name myFile)
do
cp something $f
done
Nếu bạn có không gian hoặc tab, bạn có thể sử dụng tùy chọn của tìm kiếm -exec
. Bạn vượt qua -exec command args
, đặt {}
nơi bạn muốn tên tệp được thay thế và kết thúc các đối số bằng một số ;
. Bạn cần báo giá số {}
và ;
để vỏ không diễn giải chúng.
find . -name myFile -exec cp something "{}" \;
Đôi khi -exec
không đủ. Ví dụ: trong this question, họ muốn sử dụng mở rộng tham số Bash để tính toán tên tệp. Để thực hiện điều đó, bạn cần phải vượt qua -exec bash -c 'your command'
, nhưng sau đó bạn sẽ gặp phải sự cố trích dẫn với sự thay thế {}
. Để giải quyết điều này, bạn có thể sử dụng -print0
từ find
để in các kết quả phân định với các nhân vật null (mà là không hợp lệ trong tên tập tin), và ống nó vào một vòng lặp while read
để tách các thông số trên null:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
Nguồn
2012-11-05 16:45:05
Chỉ cần thay đổi thứ tự {} thành vị trí thứ hai, sau/home/myuser/myFile và nó sẽ hoạt động. Cảm ơn. –
@ LuisAndrésGarcía, ah, tôi có thể đã hiểu lầm bạn - bạn muốn sao chép một tệp '/ home/myuser/myFile' để ghi đè lên bất kỳ' myFile' nào được tìm thấy bằng 'find' trong cwd? –
Bạn đã đúng! :) Một ví dụ khác, để liệt kê các thuộc tính của bất kỳ tệp được tìm thấy nào là: find -exec ls -l {} ';' –