2011-10-04 25 views
13

Tôi có một lệnh rất dài trong bash, mà tôi không muốn gõ tất cả các thời gian, vì vậy tôi đặt một bí danh trong .profile tôiSử dụng một bí danh trong find -exec

alias foo='...' 

Bây giờ tôi muốn thực hiện bí danh này sử dụng tìm exec

find . -exec foo '{}' \; 

nhưng thấy không thể tìm thấy foo:

tìm: foo: không có tập tin hoặc thư mục

Có thể sử dụng bí danh để tìm không?

Trả lời

7

Không, tìm thấy không biết gì về bí danh của bạn. Bí danh không giống như biến môi trường ở chỗ chúng không được "kế thừa" bởi các tiến trình con.

Bạn có thể tạo tập lệnh shell có cùng lệnh, đặt quyền + x và đặt nó trong đường dẫn của bạn. Điều này sẽ làm việc với tìm.

0

Không thể (hoặc khó khăn/dễ xảy ra lỗi) để sử dụng bí danh trong lệnh find. Một cách dễ dàng hơn để đạt được kết quả mong muốn là đưa các nội dung của bí danh trong một shellscript và chạy mà shellscript:

alias foo | sed "s/alias foo='//;s/'$/ \"\[email protected]\"/" > /tmp/foo 
find -exec bash /tmp/foo {} \; 

Lệnh sed loại bỏ các hàng đầu alias foo=' và thay thế các dấu ' bởi "[email protected]" mà sẽ chứa các đối số được chuyển đến tập lệnh.

0

Tôi đang sử dụng ll thường biết bí danh cho ví dụ này nhưng bạn có thể sử dụng bí danh của bạn thay vào đó, chỉ cần thay thế ll trong dòng sau với bí danh của bạn (foo) và nó sẽ làm việc:

find . -exec `alias ll | cut -d"'" -f2` {} \; 

trường hợp của bạn :

find . -exec `alias foo | cut -d"'" -f2` {} \; 

Lưu ý nó giả định bí danh của bạn được trích dẫn bằng cách sử dụng cú pháp sau:

alias foo='your-very-long-command' 
9

find bản thân nó không biết gì về bí danh, nhưng trình bao của bạn không. Nếu bạn đang sử dụng phiên bản đủ gần đây của bash (tôi nghĩ 4.0 đã thêm tính năng này), bạn có thể sử dụng find . -exec ${BASH_ALIASES[foo]} {} \; để chèn nội dung theo nghĩa đen của bí danh vào thời điểm đó trong dòng lệnh.

0

Tôi chạy vào cùng một điều và thực hiện khá nhiều giải pháp của skjaidev.

Tôi tạo ra một kịch bản bash gọi findVim.sh với các nội dung sau:

[ [email protected]:~ ]$ cat findVim.sh                          #!/bin/bash                                                                                                                                                                  
find . -iname $1 -exec vim '{}' \; 

Sau đó, tôi được thêm vào các .bashrc bí danh như:

[ [email protected]:~ ]$ cat ~/.bashrc | grep fvim                       
alias fvim='sh ~/findVim.sh' 

Cuối cùng, tôi nạp lại .bashrc với nguồn ~/.bashrc.

Anyways dài truyện ngắn tôi có thể chỉnh sửa kịch bản tùy ý tập tin nhanh hơn một chút với: $ fvim foo.groovy

câu chuyện quá mát mẻ lâu không Bro đọc.

0

Bạn có thể sử dụng biến thay thế.

Vì vậy, thay vì:

alias foo="echo test" 

sử dụng:

foo="echo test" 

sau đó thực hiện nó bằng cách thay thế lệnh hoặc eval, ví dụ:

find . -type f -exec sh -c "eval $foo" \; 

hay:

find . -type f -exec sh -c "echo `$foo`" \; 

Dưới đây là ví dụ thực tế mà là tìm tất cả các file không nhị phân:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())' 
find . -type f -exec bash -c "python -c '$IS_BINARY' {} || echo {}" \; 
1

Một cách khác để gọi một bí danh khi xử lý kết quả tìm là sử dụng cái gì đó như this answer

nên sau nên công việc:

alias ll="ls -al" 
find . -type d | while read folder; do ll $folder; done 
Các vấn đề liên quan