जवाबों:
cd /path/to/your/folder
sed -i 's/foo/bar/g' *
"फू" के अवसरों को "बार" से बदल दिया जाएगा।
बीएसडी सिस्टम जैसे macOS पर, आपको मेन्यू के अनुसार बैकअप एक्सटेंशन -i '.bak'
या फिर "जोखिम भ्रष्टाचार या आंशिक सामग्री" प्रदान करने की आवश्यकता है ।
cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *
sed
, -i
इसके बाद एक स्ट्रिंग की आवश्यकता होती है, जिसे पुराने फ़ाइल नामों से जोड़ा जाता है। इसलिए sed -i .bak 's/foo/bar/g' *.xx
सभी .xx
फाइलों को समतुल्य .xx.bak
नाम पर ले जाता है और फिर .xx
फू → बार प्रतिस्थापन के साथ फाइल उत्पन्न करता है ।
sed -i 's/foo\ with\ spaces/bar/g' *
। मुझे लगता है कि आप इतने लंबे समय के बाद पता चला है ... लेकिन इस तरह से यह दूसरों के लिए एक ही मुद्दा खोजने के लिए रहता है।
sed -i -e 's/foo/bar/g' $(find /home/user/base/dir)
कास्पर के जवाब के समान लेकिन एक रेखा पर सभी घटनाओं को बदलने के लिए जी ध्वज के साथ।
find ./ -type f -exec sed -i 's/string1/string2/g' {} \;
वैश्विक मामले के लिए असंवेदनशील:
find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;
LC_ALL=C find ./ -type f -exec sed -i '' -e 's/proc.priv/priv/g' {} \;
( यह पोस्ट देखें और यह एक )
--include=*.whatever
-r के साथ जोड़ने की जरूरत है
.git/
। cd
निचले स्तर तक नीचे जाना सुनिश्चित करें ।
git status
रिटर्न error: bad index file sha1 signature.... fatal: index file corrupt
:। क्या देता है?
@ केव का उत्तर अच्छा है, लेकिन केवल तत्काल निर्देशिका में फ़ाइलों को प्रभावित करता है। नीचे दिए गए उदाहरण grep का उपयोग करके फ़ाइलों को पुन: खोजते हैं। यह मेरे लिए हर काम करता है।
grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @
कमान टूटना
grep -r : --recursive , प्रत्येक निर्देशिका के अंतर्गत सभी फ़ाइलों को पुन: पढ़ने के लिए।
grep -l : --print-with- match, प्रत्येक फाइल के नाम को प्रिंट करता है जिसमें मैचिंग लाइनें प्रिंट करने के बजाय एक मैच होता है।
grep -i : --ignore-case ।
xargs : STDIN को तर्कों में रूपांतरित करें, इस उत्तर का पालन करें ।
xargs -i @ ~ कमांड में ~ ~ शामिल हैं : तर्क के लिए एक प्लेसहोल्डर ~ कमांड ~ में एक विशिष्ट स्थिति में उपयोग किया जाता है , @ चिह्न एक प्लेसहोल्डर है जो किसी भी स्ट्रिंग द्वारा प्रतिस्थापित किया जा सकता है।
sed -i : फ़ाइलों को बिना बैकअप के , जगह में संपादित करें ।
एसईडी एस / regexp / प्रतिस्थापन / : स्थानापन्न स्ट्रिंग मिलान regexp साथ प्रतिस्थापन ।
sed s / regexp / प्रतिस्थापन / g : वैश्विक , केवल पहले मैच के बजाय प्रत्येक मैच के लिए प्रतिस्थापन बनाते हैं।
grep --include={*.php,*.html,*.js} -rnl './' -e "old-word" | xargs -i@ sed -i 's/old-word/new-word/g' @
|
, इसके अलावा, -i
ज़र्ग्स कमांड में क्यों ? मैं मैनुअल में पढ़ा जाता हूं यह पदावनत है और -I
इसके बजाय उपयोग करना चाहिए । और @
पैटर्न के लिए शुरुआत और अंत के लिए एक सीमांकक के रूप में उपयोग किया जाता है?
grep -rli 'old-word' * | xargs -I@ sed -i '' 's/2.0.0/latest/g' @
rli
) और @
उदाहरण के लिए संकेत
यह मेरे लिए काम किया:
find ./ -type f -exec sed -i 's/string1/string2/' {} \;
हॉवरवर, यह नहीं किया sed -i 's/string1/string2/g' *
:। शायद "फू" का अर्थ स्ट्रिंग 1 नहीं था और "बार" स्ट्रिंग 2 नहीं था।
find ./ -type f -exec sed -i '' -e 's/string1/string2/' {} \;
पहले से सूचीबद्ध इस के लिए कुछ मानक उत्तर हैं। आम तौर पर, आप फ़ाइलों को पुनरावर्ती रूप से सूचीबद्ध करने के लिए खोज का उपयोग कर सकते हैं और फिर sed या पर्ल के साथ संचालन कर सकते हैं ।
अधिकांश त्वरित उपयोगों के लिए, आप पा सकते हैं कमांड आरपीएल याद रखना बहुत आसान है। यहाँ प्रतिस्थापन है (फू -> बार), सभी फ़ाइलों पर पुनरावर्ती:
rpl -R foo bar .
आपको शायद इसे ( apt-get install rpl
या समान) स्थापित करने की आवश्यकता होगी ।
हालाँकि, कठिन नौकरियों के लिए जिनमें नियमित अभिव्यक्ति और बैक प्रतिस्थापन शामिल हैं, या नाम बदलने के साथ-साथ खोज-और-फ़ाइल भी दर्ज करते हैं, सबसे सामान्य और शक्तिशाली उपकरण जिसके बारे में मुझे पता है, वह रीप्रैन है , एक छोटा पायथन स्क्रिप्ट जिसे मैंने कुछ समय पहले लिखा था कांटेदार नामकरण और कार्य को फिर से शुरू करना। आप इसे पसंद कर सकते हैं कारण हैं:
इसके इस्तेमाल के लिये pip install repren
। उदाहरणों के लिए README की जाँच करें ।
एक स्ट्रिंग को कई फ़ाइलों में बदलने के लिए जिसका आप उपयोग कर सकते हैं:
grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'
उदाहरण के लिए
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
फ़ाइलों के भीतर एक पथ को बदलने के लिए (भागने के पात्रों से बचने के लिए) आप निम्न आदेश का उपयोग कर सकते हैं:
sed -i 's@old_path@new_path@g'
@ चिह्न का मतलब है कि सभी विशेष वर्णों को निम्नलिखित स्ट्रिंग में अनदेखा किया जाना चाहिए।
यदि आपकी स्ट्रिंग में आगे स्लैश (/) है, तो आप सीमांकक को '+' में बदल सकते हैं।
find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +
यह आदेश वर्तमान निर्देशिका में पुनरावर्ती रूप से चलेगा।
../domain.com
करने के लिएdomain.com
"फू" की पहली पंक्ति की घटनाओं को "बार" से बदल दिया जाएगा। और आप दूसरी लाइन का उपयोग करके जांच कर सकते हैं।
grep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
grep 'foo' -r * | awk -F: {'print $1'} | sort -n | uniq -c
grep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
यदि आपके पास उन फ़ाइलों की सूची है जिनका आप उपयोग कर सकते हैं
replace "old_string" "new_string" -- file_name1 file_name2 file_name3
यदि आपके पास सभी फाइलें हैं तो आप उपयोग कर सकते हैं
replace "old_string" "new_string" -- *
यदि आपके पास एक्सटेंशन वाली फ़ाइलों की सूची है, तो आप उपयोग कर सकते हैं
replace "old_string" "new_string" -- *.extension
replace "old_string" "new_string" -- *.txt
replace
उपयोगिता को प्राप्त करने के लिए इसे जोड़ना बेहतर है । इस जानकारी के बिना, यह उत्तर अधूरा है।
"आप फाइंड और सेड का भी उपयोग कर सकते हैं, लेकिन मुझे लगता है कि पर्ल की यह छोटी लाइन अच्छी तरह से काम करती है।
perl -pi -w -e 's/search/replace/g;' *.php
"( Http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php से निकाला गया )
मेरे सर्वोत्तम परिणाम पर्ल और grep का उपयोग करने से आते हैं (यह सुनिश्चित करने के लिए कि फ़ाइल में खोज अभिव्यक्ति है)
perl -pi -w -e 's/search/replace/g;' $( grep -rl 'search' )
यह देखते हुए कि आप स्ट्रिंग की खोज करना चाहते हैं search
और इसे replace
कई फाइलों के साथ बदलना चाहते हैं , यह मेरा युद्ध-परीक्षण, एक-पंक्ति सूत्र है :
grep -RiIl 'search' | xargs sed -i 's/search/replace/g'
त्वरित संक्षिप्त विवरण:
-R
- पुनरावर्ती खोज-i
- असंवेदनशील मामला-I
- बाइनरी फ़ाइलें छोड़ें (आप पाठ चाहते हैं, ठीक है?)-l
- आउटपुट के रूप में एक साधारण सूची प्रिंट करें। अन्य आज्ञाओं की आवश्यकता हैफिर grep आउटपुट को sed (xargs के माध्यम से) पाइप किया जाता है, जिसका उपयोग वास्तव में टेक्स्ट को बदलने के लिए किया जाता है। -i
झंडा सीधे फ़ाइल को बदल देगा। इसे "ड्राई रन" मोड के लिए निकालें।
इससे पहले कि मैं यह सवाल (और जवाब) पाता मैं अपना समाधान खुद कर लेता। मैंने "बदलें" "कई" और "xml" के विभिन्न संयोजनों की खोज की, क्योंकि यह मेरा आवेदन था, लेकिन यह विशेष नहीं मिला।
मेरी समस्या: मेरे पास परीक्षण के मामलों के लिए डेटा के साथ स्प्रिंग एक्सएमएल फाइलें थीं, जिनमें जटिल वस्तुएं थीं। जावा स्रोत कोड पर एक रिफ्लेक्टर ने बहुत सारी कक्षाएं बदल दीं और xml डेटा फ़ाइलों पर लागू नहीं हुईं। परीक्षण मामलों के डेटा को बचाने के लिए, मुझे कई निर्देशिकाओं में वितरित सभी xml फ़ाइलों में सभी वर्ग नामों को बदलने की आवश्यकता है। सभी मूल xml फ़ाइलों की बैकअप प्रतियों को सहेजते समय (हालांकि यह बहुत जरूरी नहीं था, क्योंकि संस्करण नियंत्रण मुझे यहां बचाएगा)।
मुझे find
+ के कुछ संयोजन की तलाश थी sed
, क्योंकि यह मेरे लिए अन्य स्थितियों में काम करता था, लेकिन एक साथ कई प्रतिस्थापनों के साथ नहीं।
तब मुझे ubuntu प्रतिक्रिया पूछने में मदद मिली और इसने मुझे अपनी कमांड लाइन बनाने में मदद की:
find -name "*.xml" -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;
और इसने पूरी तरह से काम किया (ठीक है, मेरे मामले में छह अलग-अलग प्रतिस्थापन थे)। लेकिन कृपया ध्यान दें कि यह वर्तमान निर्देशिका के तहत सभी * .xml फ़ाइलों को स्पर्श करेगा। उसके कारण, और यदि आप एक संस्करण नियंत्रण प्रणाली के प्रति जवाबदेह हैं, तो आप पहले फ़िल्टर करना चाहते हैं और केवल sed
उन पर पास करना चाहते हैं जो वास्तव में आप चाहते हैं; पसंद:
find -name "*.xml" -exec grep -e "firstWord" -e "secondWord" -e "thirdWord" {} \; -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;
findstr /spin /c:"quéquieresbuscar" *.xml
यह आसान होगा।
वास्तव में लंगड़ा, लेकिन मुझे OSX पर सही काम करने के लिए कोई भी सीड कमांड नहीं मिल सका, इसलिए मैंने इसके बजाय यह गूंगा काम किया:
:%s/foo/bar/g
:wn
^ - मेरे क्लिपबोर्ड में इन तीन पंक्तियों को कॉपी करें (हां, समाप्त होने वाली न्यूलाइन शामिल करें), फिर:
vi *
और कमांड-वी को तब तक दबाए रखें जब तक यह न कहे कि कोई फाइल नहीं बची है।
बेवकूफ ... hacky ... प्रभावी ...
मैकबुक प्रो पर, मैंने निम्नलिखित का उपयोग किया ( https://stackoverflow.com/a/19457213/6169225 से प्रेरित ):
sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *
-i ''
यह सुनिश्चित करेगा कि आप कोई बैकअप नहीं ले रहे हैं।
-e
आधुनिक रेगेक्स के लिए।
-e
बस sed को बताता है कि अगला टोकन एक कमांड है। विस्तारित नियमित अभिव्यक्तियों के लिए, -E
इसके बजाय उपयोग करें ।
स्ट्रीम के -i
स्विच के साथ आने पर स्ट्रीम एडिटर कई फाइलों को "इनहेल्ड" कर देता है , जो कि तर्क के रूप में समाप्त होने वाली बैकअप फाइल लेता है। इसलिए
sed -i.bak 's/foo/bar/g' *
इस फ़ोल्डर में सभी फ़ाइलों के foo
साथ बदलता है bar
, लेकिन सबफ़ोल्डर में नहीं उतरता है। हालाँकि यह .bak
आपकी निर्देशिका में प्रत्येक फ़ाइल के लिए एक नई फ़ाइल उत्पन्न करेगा । इस निर्देशिका और इसकी सभी उपनिर्देशिकाओं की सभी फ़ाइलों के लिए पुनरावर्ती रूप से ऐसा करने के लिए, आपको find
निर्देशिका ट्री को पार करने के लिए एक सहायक की आवश्यकता होती है ।
find ./ -print0 | xargs -0 sed -i.bak 's/foo/bar/g' *
find
find ./ -name '*.php' -or -name '*.html' -print0
यदि आवश्यक हो, तो आगे की दलीलें निर्दिष्ट करके, आपको क्या फ़ाइलों को संशोधित करने की अनुमति देता है।
नोट: जीएनयू sed
को फ़ाइल समाप्त होने की आवश्यकता नहीं है sed -i 's/foo/bar/g' *
, साथ ही काम करेगा; FreeBSD sed
एक विस्तार की मांग करता है, लेकिन बीच में एक जगह की अनुमति देता है, इसलिए sed -i .bak s/foo/bar/g *
काम करता है।
मल्टीडेट कमांड के लिए स्क्रिप्ट
multiedit [-n PATTERN] OLDSTRING NEWSTRING
कास्पर के जवाब से मैंने कमांड लाइन के तर्क को स्वीकार करने के लिए एक बैश स्क्रिप्ट बनाई और वैकल्पिक रूप से पैटर्न से मेल खाने वाले फ़ाइलनाम को सीमित किया। अपने $ पेट में सहेजें और निष्पादन योग्य बनाएं, फिर ऊपर दिए गए कमांड का उपयोग करें।
यहाँ स्क्रिप्ट है:
#!/bin/bash
_help="\n
Replace OLDSTRING with NEWSTRING recursively starting from current directory\n
multiedit [-n PATTERN] OLDSTRING NEWSTRING\n
[-n PATTERN] option limits to filenames matching PATTERN\n
Note: backslash escape special characters\n
Note: enclose STRINGS with spaces in double quotes\n
Example to limit the edit to python files:\n
multiedit -n \*.py \"OLD STRING\" NEWSTRING\n"
# ensure correct number of arguments, otherwise display help...
if [ $# -lt 2 ] || [ $# -gt 4 ]; then echo -e $_help ; exit ; fi
if [ $1 == "-n" ]; then # if -n option is given:
# replace OLDSTRING with NEWSTRING recursively in files matching PATTERN
find ./ -type f -name "$2" -exec sed -i "s/$3/$4/g" {} \;
else
# replace OLDSTRING with NEWSTRING recursively in all files
find ./ -type f -exec sed -i "s/$1/$2/" {} \;
fi
यदि फ़ाइल में बैकस्लैश हैं (आमतौर पर पथ) तो आप कुछ इस तरह की कोशिश कर सकते हैं:
sed -i -- 's,<path1>,<path2>,g' *
उदाहरण के लिए:
sed -i -- 's,/foo/bar,/new/foo/bar,g' *.sh (in all shell scripts available)
अपनी व्यक्तिगत अंग्रेजी नोड को बनाए रखने के लिए, मैंने एक उपयोगिता स्क्रिप्ट लिखी जो किसी निर्देशिका के तहत सभी फाइलों के लिए पुरानी / नई स्ट्रिंग के कई जोड़े को बदलने में मदद करती है।
पुराने / नए स्ट्रिंग की कई जोड़ी को हैश मैप में प्रबंधित किया जाता है।
डायर को कमांड लाइन या पर्यावरण चर के माध्यम से सेट किया जा सकता है, मानचित्र को स्क्रिप्ट में कठिन कोडित किया गया है, लेकिन यदि आवश्यक हो, तो आप फ़ाइल से लोड करने के लिए कोड को संशोधित कर सकते हैं।
कुछ नए फीचर के कारण इसे bash 4.2 की आवश्यकता है।
en_standardize.sh:
#! /bin/bash
# (need bash 4.2+,)
#
# Standardize phonetic symbol of English.
#
# format:
# en_standardize.sh [<dir>]
#
# params:
# * dir
# target dir, optional,
# if not specified then use environment variable "$node_dir_en",
# if both not provided, then will not execute,
# *
#
paramCount=$#
# figure target dir,
if [ $paramCount -ge 1 ]; then # dir specified
echo -e "dir specified (in command):\n\t$1\n"
targetDir=$1
elif [[ -v node_dir_en ]]; then # environable set,
echo -e "dir specified (in environment vairable):\n\t$node_dir_en\n"
targetDir=$node_dir_en
else # environable not set,
echo "dir not specified, won't execute"
exit
fi
# check whether dir exists,
if [ -d $targetDir ]; then
cd $targetDir
else
echo -e "invalid dir location:\n\t$targetDir\n"
exit
fi
# initial map,
declare -A itemMap
itemMap=( ["ɪ"]="i" ["ː"]=":" ["ɜ"]="ə" ["ɒ"]="ɔ" ["ʊ"]="u" ["ɛ"]="e")
# print item maps,
echo 'maps:'
for key in "${!itemMap[@]}"; do
echo -e "\t$key\t->\t${itemMap[$key]}"
done
echo -e '\n'
# do replace,
for key in "${!itemMap[@]}"; do
grep -rli "$key" * | xargs -i@ sed -i "s/$key/${itemMap[$key]}/g" @
done
echo -e "\nDone."
exit
Ack कमांड का प्रयोग इस तरह तेजी से होगा:
ack '25 Essex' -l | xargs sed -i 's/The\ fox \jump/abc 321/g'
इसके अलावा यदि आपके पास खोज परिणाम में एक सफेद स्थान है। आपको इससे बचने की जरूरत है।
मैं अजगर स्रोतों में एक सामान्य शेबंग त्रुटि को ठीक करने के लिए एक उदाहरण दे रहा हूं।
आप grep / sed दृष्टिकोण की कोशिश कर सकते हैं। यहाँ एक है जो GNU sed के साथ काम करता है और एक git रेपो को नहीं तोड़ेगा:
$ grep -rli --exclude '*.git*' '#!/usr/bin/python' . | xargs -I {} \
gsed -i '' -e 's/#!\/usr\/bin\/python/#!\/usr\/bin\/env python/' {}
या आप greptile का उपयोग कर सकते हैं :)
$ greptile -x .py -l -i -g '#!/usr/bin/env python' -r '#!/usr/bin/python' .
मैंने सिर्फ पहली स्क्रिप्ट का परीक्षण किया, और दूसरे को भी काम करना चाहिए। भागने के पात्रों के साथ सावधान रहें, मुझे लगता है कि ज्यादातर मामलों में ग्रेप्टाइल का उपयोग करना आसान होना चाहिए। बेशक, आप बहुत सी दिलचस्प चीजें सेड के साथ कर सकते हैं, और इसके लिए इसे xargs के साथ मास्टर करना बेहतर हो सकता है।
मैंने इसे एक अन्य पोस्ट से पाया (जो याद नहीं कर सकता) और सबसे सुरुचिपूर्ण नहीं होने के बावजूद, यह सरल है और नौसिखिया के रूप में लिनक्स उपयोगकर्ता ने मुझे कोई परेशानी नहीं दी है
for i in *old_str* ; do mv -v "$i" "${i/\old_str/new_str}" ; done
यदि आपके पास रिक्त स्थान हैं या अन्य विशेष वर्ण a का उपयोग करते हैं
for i in *old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done
उप-निर्देशिकाओं में तार के लिए **
for i in *\*old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done
एक सरल स्क्रिप्ट फ़ाइल का उपयोग करके एक आसान तरीका है:
# sudo chmod +x /bin/replace_string_files_present_dir
फ़ाइल को gedit में खोलें या अपनी पसंद के संपादक के लिए, मैं यहाँ gedit का उपयोग करता हूँ।
# sudo gedit /bin/replace_string_files_present_dir
फिर संपादक में फ़ाइल में निम्नलिखित पेस्ट करें
#!/bin/bash
replace "oldstring" "newstring" -- *
replace "oldstring1" "newstring2" -- *
#add as many lines of replace as there are your strings to be replaced for
#example here i have two sets of strings to replace which are oldstring and
#oldstring1 so I use two replace lines.
फ़ाइल सहेजें, gedit बंद करें , फिर अपने टर्मिनल से बाहर निकलें या बस इसे बंद करें और फिर इसे अपने द्वारा जोड़े गए नई स्क्रिप्ट को लोड करने में सक्षम होने के लिए शुरू करें।
उस निर्देशिका पर नेविगेट करें जहां आपके पास कई फाइलें हैं जिन्हें आप संपादित करना चाहते हैं। फिर भागो:
#replace_string_files_present_dir
प्रेस दर्ज करें और यह स्वचालित रूप से सभी फाइलों में पुरानेस्ट्रिंग और पुरानेस्ट्रिंग 1 को बदल देगा , जिनमें क्रमशः सही न्यूस्ट्रिंग और न्यूस्ट्रिंग 1 शामिल हैं।
यह उन सभी निर्देशिकाओं और फ़ाइलों को छोड़ देगा जिनमें पुराने तार नहीं हैं।
यह उन मामलों में टाइपिंग के थकाऊ काम को खत्म करने में मदद कर सकता है जब आपके पास कई निर्देशिकाएं होती हैं जिनमें स्ट्रिंग प्रतिस्थापन की आवश्यकता होती है। आपको बस उन निर्देशिकाओं में से प्रत्येक पर नेविगेट करना है, फिर चलाएं:
#replace_string_files_present_dir
आपको केवल यह सुनिश्चित करना है कि आपने सभी प्रतिस्थापन स्ट्रिंग्स को शामिल किया है या जोड़ा है जैसा कि मैंने आपको ऊपर दिखाया है:
replace "oldstring" "newstring" -- *
फ़ाइल के अंत में / बिन / प्रतिस्थापित_string_files_pret_dir ।
टर्मिनल में निम्नलिखित टाइप करके हमारे द्वारा बनाई गई स्क्रिप्ट को खोलने के लिए एक नया प्रतिस्थापित स्ट्रिंग जोड़ने के लिए:
sudo gedit /bin/replace_string_files_present_dir
आपके द्वारा जोड़े गए स्ट्रिंग स्ट्रिंग की संख्या के बारे में चिंता न करें, अगर पुरानी स्ट्रिंग नहीं मिली है तो उनका कोई प्रभाव नहीं होगा ।
.gitlab-ci.yml
या एक a travis.yml
) कहते हैं । बाद में इसे अंजाम देने के लिए एक स्क्रिप्ट लिखने में शामिल हर मोड़ एक विरोधी पैटर्न है, क्योंकि आपको फिर स्क्रिप्ट निर्माण की स्क्रिप्ट की आवश्यकता होगी (और मैं गन्दा हो जाता हूं, ज्यादातर समय)
$ "से" "से" की जगह - `खोजें / पथ / से / फ़ोल्डर-प्रकार f`
(बदलें - MySQL डाटाबेस सिस्टम की एक स्ट्रिंग-प्रतिस्थापन उपयोगिता)