यदि आप GNU का उपयोग कर रहे हैं find
, तो आप -execdir
पैरामीटर आज़मा सकते हैं , जैसे:
find . -type d -execdir realpath "{}" ';'
या ( @gniourf_gniourf टिप्पणी के अनुसार ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
नोट: आप सामने वाले को ठीक करने के ${0#./}
बजाय उपयोग कर सकते हैं ।$0
./
या अधिक व्यावहारिक उदाहरण:
find . -name .git -type d -execdir git pull -v ';'
यदि आप वर्तमान निर्देशिका को शामिल करना चाहते हैं, तो यह उपयोग करके और भी सरल है -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
या उपयोग कर रहा है xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
या @gniourf_gniourf द्वारा सुझाए गए इसी तरह के उदाहरण :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
उपरोक्त उदाहरण उनके नाम में रिक्त स्थान के साथ निर्देशिकाओं का समर्थन करते हैं।
या बैश सरणी में असाइन करके:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
.
अपने विशिष्ट फ़ोल्डर का नाम बदलें । यदि आपको पुनरावर्ती चलाने की आवश्यकता नहीं है, तो आप इसका उपयोग कर सकते हैं: dirs=(*)
इसके बजाय। उपरोक्त उदाहरण नाम में रिक्त स्थान के साथ निर्देशिकाओं का समर्थन नहीं करता है।
तो जैसा कि @gniourf_gniourf ने सुझाव दिया, एक स्पष्ट लूप का उपयोग किए बिना किसी सरणी में खोजने के आउटपुट को डालने का एकमात्र उचित तरीका बैश 4.4 में उपलब्ध होगा:
mapfile -t -d '' dirs < <(find . -type d -print0)
या अनुशंसित तरीका नहीं है (जिसमें पार्सls
करना शामिल है ):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
उपरोक्त उदाहरण वर्तमान dir (जैसा कि ओपी द्वारा अनुरोध किया गया है) को अनदेखा करेगा, लेकिन यह रिक्त स्थान वाले नामों पर टूट जाएगा।
यह सभी देखें:
cd "$d"
इसमें बेहतर होगा कि यह उन स्थितियों में स्थानांतरित हो जाए जहां वाइल्डकार्ड उन फाइलों से मेल खाता है जिनके नाम में व्हॉट्सएप और / या शेल मेटाचैकर हैं।