Nếu bạn đang sử dụng GNU find
, bạn có thể thử -execdir
tham số, ví dụ:
find . -type d -execdir realpath "{}" ';'
hoặc (theo nhận xét @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Lưu ý: Bạn có thể sử dụng ${0#./}
thay vì $0
để sửa ./
ở phía trước.
hoặc ví dụ thực tế hơn:
find . -name .git -type d -execdir git pull -v ';'
Nếu bạn muốn bao gồm thư mục hiện tại, nó thậm chí còn đơn giản hơn bằng cách sử dụng -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
hoặc sử dụng xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Hoặc ví dụ tương tự được đề xuất bởi @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Các ví dụ trên hỗ trợ các thư mục có khoảng trắng trong tên của chúng.
Hoặc bằng cách gán vào mảng bash:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Thay đổi .
tên thư mục cụ thể của bạn. Nếu bạn không cần chạy đệ quy, bạn có thể sử dụng: dirs=(*)
thay vào đó. Ví dụ trên không hỗ trợ các thư mục có khoảng trắng trong tên.
Vì vậy, như @gniourf_gniourf đã đề xuất, cách thích hợp duy nhất để đưa đầu ra của find vào một mảng mà không sử dụng một vòng lặp rõ ràng sẽ có sẵn trong Bash 4.4 với:
mapfile -t -d '' dirs < <(find . -type d -print0)
Hoặc không phải là một cách được đề xuất (liên quan đến phân tích cú phápls
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
Ví dụ trên sẽ bỏ qua thư mục hiện tại (theo yêu cầu của OP), nhưng nó sẽ phá vỡ các tên có khoảng trắng.
Xem thêm:
cd "$d"
sẽ tốt hơn ở chỗ nó chuyển đến các tình huống trong đó ký tự đại diện khớp với các tệp có tên chứa khoảng trắng và / hoặc siêu ký tự shell.