पुनरावर्ती सभी फ़ाइलों की अनुगामी व्हाट्सएप कैसे निकालें?


122

आप किसी संपूर्ण प्रोजेक्ट के अनुगामी व्हाट्सएप को कैसे हटा सकते हैं? एक रूट डायरेक्टरी पर शुरू, और सभी फ़ोल्डरों में सभी फाइलों से अनुगामी व्हाट्सएप को हटाने।

इसके अलावा, मैं सीधे फाइल को संशोधित करने में सक्षम होना चाहता हूं, न कि सब कुछ प्रिंट करने के लिए।


ओह, क्या आप "पोर्टेबल" समाधान, या अधिक ओएस-विशिष्ट की तलाश कर रहे हैं? आप कौन सा ओएस उपयोग कर रहे हैं?
जो पीपे

3
मुझे इसका एक संस्करण देखना अच्छा लगेगा, जो OS X स्नो लेपर्ड पर काम करेगा, और .it और .svan फोल्डर को अनदेखा करेगा।
ट्रेवर तुर्क

जवाबों:


83

यहाँ एक OS X> = 10.6 स्नो लेपर्ड घोल है।

यह .गित और .svn फ़ोल्डर और उनकी सामग्री को अनदेखा करता है । इसके अलावा यह एक बैकअप फ़ाइल नहीं छोड़ेगा।

export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"

10
आप इसे प्रतिस्थापन स्ट्रिंग के \+बजाय उपयोग करके तेज़ बना सकते हैं *- अन्यथा यह हर एक पंक्ति पर मेल खाता है।
l0b0

10
आप टैब और रिक्त स्थान दोनों को निकालने के लिए [[: blank:]] का उपयोग कर सकते हैं।
लीफ ग्रुएनवॉल्ड

21
माउंटेन लायन में यह sed: RE error: illegal byte sequenceमेरे लिए लौटता है।
ब्रायसन

12
"अवैध बाइट अनुक्रम" के साथ आप के मुद्दों के लिए: दर्ज करें export LANG=Cऔर फिर से प्रयास करें
जॉर्ज लेडरमैन

3
ओएस एक्स में 10.9 मैं भी जरूरत export LC_CTYPE=C : के रूप में यहां पाया stackoverflow.com/questions/19242275/...
kissgyorgy

31

उपयोग:

find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'

यदि आप ".bak" फाइलें उत्पन्न नहीं करना चाहते हैं:

find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'

एक zsh उपयोगकर्ता के रूप में, आप कॉल को खोजने, और उपयोग करने के लिए छोड़ सकते हैं:

perl -pi -e 's/ +$//' **/*

नोट: .gitनिर्देशिका को नष्ट करने से रोकने के लिए , जोड़ने का प्रयास करें -not -iwholename '*.git*':।


37
इसे git रेपो में मत आज़माएं, क्योंकि यह git के आंतरिक संग्रहण को दूषित कर सकता है।
16

11
@mgold बहुत देर, grrr; /
kenorb

3
स्पष्ट करने के लिए, इसे git रेपो के सबफ़ोल्डर के अंदर चलाना ठीक है, बस किसी भी फ़ोल्डर के अंदर नहीं, जिसमें git repo (s) के वंशज होते हैं, अर्थात् .gitनिर्देशिकाओं वाले किसी भी फ़ोल्डर के अंदर नहीं , चाहे कितनी भी गहरी नेस्टेड हो।
इलिया मोस्कविन

Git / svn के मुद्दों से बचने के लिए @ डीपवेल के साथ इस उत्तर को जोड़ते हुएfind . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
विलियम डेनिस

1
वहाँ शायद एक बेहतर तरीका है, लेकिन मैं एक अलग फ़ोल्डर में रेपो को क्लोन करके इसके साथ एक गिट रेपो को प्रबंधित करने से पुनर्प्राप्त किया गया और फिर ऐसा कर रहा rsync -rv --exclude=.git repo/ repo2/था जिसके बाद स्थानीय परिवर्तन repoभी (अप्रकाशित) थे repo2
MatrixManAtYrService 19

29

दो वैकल्पिक दृष्टिकोण जो डॉस newlines (CR / LF) के साथ काम करते हैं और बाइनरी फ़ाइलों से बचने के लिए बहुत अच्छा काम करते हैं :

सामान्य समाधान जो यह जाँचता है कि MIME प्रकार की शुरुआत text/निम्न से होती है :

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . -type f -print0)

चटाई द्वारा गिट रिपॉजिटरी-विशिष्ट समाधान जो उनफ़ाइलों को छोड़नेके-Iविकल्प काउपयोग करता हैgit grepजिन्हें गिट द्विआधारी मानते हैं:

git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'

3
इसलिए मुझे वास्तव में यह समाधान पसंद है। यह वास्तव में शीर्ष पर होना चाहिए। मैं हालांकि गाड़ी का रिटर्न नहीं बचाना चाहता। लेकिन मैं इसे 2010 में संयुक्त रूप से पसंद करता हूं।
ओडिन्हो - वेलमॉन्ट

मेरे Git शिकायत है कि -e अभिव्यक्ति खाली है, लेकिन यह -e का उपयोग कर अच्छा काम करता है '*।'
muirbot

@okor में जीएनयू sedको प्रत्यय विकल्प -iहै वैकल्पिक है, लेकिन में बीएसडीsed यह नहीं है। यह कड़ाई से वैसे भी जरूरी नहीं बोल रहा है, इसलिए मैं इसे हटा दूंगा।
l0b0

24

बैश में:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

नोट: यदि आप .gitभंडार का उपयोग कर रहे हैं , तो जोड़ने का प्रयास करें -not -iwholename '.git':।


यह मिली हर फ़ाइल के लिए इस तरह की त्रुटियाँ उत्पन्न करता है। sed: 1: "dir / file.txt": टेक्स्ट के बाद एक
एक्सपेक्टेश

की जगह '?' साथ में \; कार्य करना चाहिए। ({{} के आसपास के उद्धरणों की सख्त जरूरत नहीं है)।
agnul

4
सभी व्हाट्सएप को हटाने के लिए न केवल रिक्त स्थान की जगह आपको अपने नियमित रेगुलर एक्सप्रेशन में [: ​​space:] के साथ स्पेस कैरेक्टर को बदलना चाहिए।
WMR

एक और पक्ष नोट: यह केवल sed संस्करणों> = 4 के साथ काम करता है, छोटे संस्करण जगह संपादन में समर्थन नहीं करते हैं।
WMR

1
इससे मेरी
पकड़

14

यह मेरे लिए OSX 10.5 तेंदुए में काम करता है, जो GNU sed या xargs का उपयोग नहीं करता है।

find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"

बस इसके साथ सावधान रहें यदि आपके पास ऐसी फाइलें हैं जिन्हें बाहर रखा जाना है (मैंने किया था)!

आप कुछ निर्देशिकाओं या फ़ाइलों को अनदेखा करने के लिए -prune का उपयोग कर सकते हैं। एक गैट भंडार में अजगर फ़ाइलों के लिए, आप कुछ इस तरह का उपयोग कर सकते हैं:

find dir -not -path '.git' -iname '*.py'

कोई भी मौका आप इसे स्पष्ट कर सकते हैं? मुझे एक ऐसी कमांड चाहिए, जो ".itit" डायरेक्टरी को नजरअंदाज करते हुए एक डायरेक्ट्री में सभी फाइलों में से व्हाट्सएप को पीछे छोड़ देगी। मैं आपके उदाहरण का काफी अनुसरण नहीं कर सकता ...
ट्रेवर तुर्क

यदि आप tcsh का उपयोग कर रहे हैं तो आपको दोहरे उद्धरण चिह्नों को एकल उद्धरण में बदलने की आवश्यकता होगी। अन्यथा, आपको "अवैध चर नाम" मिलेगा। त्रुटि।
ब्रैंडन फॉसडिक

GNU sed समान है लेकिन आप करते हैं -i.bak या --in-place = .bak, एक पूर्ण कमांड के साथ समाप्त होता है find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'dirशीर्ष पर-स्तर के रूप में प्रश्न से निर्देशिका को प्रतिस्थापित करना।
डेविड गार्डनर

sed -i .bak? यह sed -i.bak(अंतरिक्ष के बिना) नहीं होना चाहिए ?
ओन्ड्रा kaसिकाका

9

इस तरह के टास्क के लिए Ack बनाया गया था।

यह grep की तरह ही काम करता है, लेकिन .svan, .it, .cv आदि जैसी जगहों पर नहीं उतरता है।

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

मिल / grep के साथ हुप्स के माध्यम से कूदने की तुलना में बहुत आसान है।

Ack अधिकांश पैकेज प्रबंधकों (जैसे ack या ack-grep ) के माध्यम से उपलब्ध है ।

यह सिर्फ एक पर्ल प्रोग्राम है, इसलिए यह एकल-फ़ाइल संस्करण में भी उपलब्ध है जिसे आप बस डाउनलोड और चला सकते हैं। देखें: Ack Install


ackअद्भुत है। कई वर्षों से इसका उपयोग कर रहे हैं, और अधिकांश डिस्ट्रो के लिए लगभग सभी पैकेज रिपोज में उपलब्ध हैं।
फेलिप अल्वारेज

8

ex

पूर्व संपादक (विम का हिस्सा) का उपयोग करने का प्रयास करें :

$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*

नोट: पुनरावर्तन (बैश 4 और zsh) के लिए, हम एक नए ग्लोबिंग विकल्प ( **/*.*) का उपयोग करते हैं। द्वारा सक्षम करें shopt -s globstar

आप निम्नलिखित फ़ंक्शन को अपने में जोड़ सकते हैं .bash_profile:

# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
  ex +'bufdo!%s/\s\+$//e' -cxa $*
}

sed

उपयोग करने के लिए sed, जांच करें: पालक के साथ ट्रेलिंग व्हाट्सएप कैसे निकालें?

find

निम्न स्क्रिप्ट (जैसे remove_trail_spaces.sh) फ़ाइलों से अनुगामी व्हाट्सएप निकालने के लिए खोजें :

#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: /programming/149057/how-to-remove-trailing-whitespace-of-all-files-recursively

case "$OSTYPE" in
  darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
    find . -type f -not -iwholename '*.git*' -print0  | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
    find . -type f -name \*.bak -print0 | xargs -0 rm -v
    ;;
  *)
    find . -type f -not -iwholename '*.git*' -print0 | xargs -0 perl -pi -e 's/ +$//'
esac

इस स्क्रिप्ट को उस निर्देशिका से चलाएँ जिसे आप स्कैन करना चाहते हैं। अंत में OSX पर, यह समाप्त होने वाली सभी फ़ाइलों को हटा देगा .bak

या केवल:

find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;

स्प्रिंग फ्रेमवर्क कोड शैली द्वारा अनुशंसित तरीका है ।


find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;केवल सभी के बजाय एक अनुगामी स्थान को निकालता है।
कार्ल रिक्टर

6

मैंने बैकअप फ़ाइलों का निर्माण नहीं करने और ढूंढने का उपयोग नहीं किया।

sed -i '' 's/[[:space:]]*$//g' **/*.*

फ़ाइल ट्री की गहराई के आधार पर, यह (छोटा संस्करण) आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है।

उदाहरण के लिए, बाइनरी फाइलें भी लेता है।


विशिष्ट फ़ाइलों के लिए: खोजें। -नाम '* .rb' | xargs -I {} sed -i '' s / [[: space:]] * $ // g '{}
गौतम रेगे

आपको sed के लिए '' पैरामीटर की आवश्यकता नहीं है; या मुझे कुछ याद आ रहा है। मैंने इसे दी गई डायरेक्टरी में सभी फाइलों पर इस तरह आज़माया: sed -i's / [[: space:]] * $ // g 'यूज़ / *। M
Mircea

6

फ़ाइलों को बाहर करने के बजाय, यहाँ फ़ाइल एक्सटेंशन के आधार पर फ़ाइलों की स्पष्ट रूप से सफेद सूचियों की उपरोक्त विविधता है, जिसे आप पट्टी करना चाहते हैं, स्वाद के लिए स्वतंत्र महसूस करें:

find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"

: मेरे लिए काम करने के लिए इस के लिए मैं उद्धरण जोड़ने के लिए की जरूरत है-name "*.rb*"
haroldcarr

5

मैंने इसे चलाना समाप्त कर दिया, जो कि पूजो और एडम्स संस्करण के बीच का मिश्रण है।

यह दोनों अनुगामी व्हाट्सएप को साफ करेगा, और अनुगामी व्हॉट्सएप का एक और रूप, गाड़ी वापसी:

find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
  -exec sed -i 's/[:space:]+$//' \{} \;  \
  -exec sed -i 's/\r\n$/\n/' \{} \;

अगर कोई एक है तो यह .गित फ़ोल्डर को नहीं छूएगा।

संपादित करें : टिप्पणी के बाद इसे थोड़ा सुरक्षित बना दिया, इसमें ".itit" या ".svn" के साथ फाइल लेने की अनुमति नहीं दी। लेकिन सावधान रहना, यह होगा बाइनरी फ़ाइलें स्पर्श अगर आप कुछ मिल गया है। उपयोग करने के -iname "*.py" -or -iname "*.php"बाद -type fयदि आप इसे केवल .py और .php-files को छूने के लिए चाहते हैं।

अद्यतन 2 : यह अब लाइन के अंत में सभी प्रकार के रिक्त स्थान को बदल देता है (जिसका अर्थ टैब भी है)


4
मुझे नहीं पता कि क्या चल रहा है, लेकिन इसने मेरे गिट रेपो को पूरी तरह से विफल कर दिया और मेरी छवियों के साथ खिलवाड़ किया। लोगों, मैं अधिक से अधिक कार्निवल होगा!
मट्टलक्षेंदर

हाँ, यह बाइनरी फ़ाइलों को बर्बाद कर देगा। हालाँकि, यह आपके git रेपो को बिल्कुल भी स्पर्श नहीं करना चाहिए, क्योंकि यह एक .गित-फ़ोल्डर के अंदर जो भी रहता है, उसे छोड़ देता है। लेकिन शायद केवल अगर आप एक ही फ़ोल्डर में हैं।
ओडिन्हो - वेलमॉन्ट

4

यह अच्छी तरह से काम करता है .. विशिष्ट फ़ाइल प्रकारों के लिए - निकालें / निकालें:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'


3

मैं नियमित अभिव्यक्ति का उपयोग करता हूं। 4 चरण:

  1. अपने संपादक में रूट फ़ोल्डर खोलें (मैं विजुअल स्टूडियो कोड का उपयोग करता हूं)।
  2. बाईं ओर स्थित खोज आइकन टैप करें, और नियमित अभिव्यक्ति मोड को सक्षम करें।
  3. खोज बार में "+ \ n" दर्ज करें और बदलें बार में "\ n"।
  4. "सभी बदलें" पर क्लिक करें।

यह सभी फ़ाइलों में प्रत्येक पंक्ति के अंत में सभी अनुगामी रिक्त स्थान को निकालता है। और आप कुछ ऐसी फ़ाइलों को बाहर कर सकते हैं जो इस आवश्यकता के साथ फिट नहीं हैं।


2

1) कई अन्य उत्तर उपयोग करते हैं -E। मुझे यकीन नहीं है कि, क्योंकि यह अनिर्दिष्ट बीएसडी संगतता विकल्प है। -rइसके बजाय उपयोग किया जाना चाहिए।

2) अन्य उत्तर उपयोग करते हैं -i ''। यह सिर्फ -i(या -i''यदि पहले से हो) होना चाहिए , क्योंकि -iइसके ठीक बाद प्रत्यय है।

3) गेट विशिष्ट समाधान:

git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'

git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'

पहले वाला एक git उपनाम दर्ज check-whitespaceकरता है जो अनुगामी व्हाट्सएप के साथ फाइलों को सूचीबद्ध करता है। दूसरा sedउन पर चलता है।

मैं केवल \tइसके बजाय इसका उपयोग [:space:]करता हूं क्योंकि मैं आमतौर पर ऊर्ध्वाधर टैब, फॉर्म फ़ीड और गैर-ब्रेक करने योग्य स्थान नहीं देखता हूं। आपका माप भिन्न हो सकता है।


1

यह मेरे लिए काम करता है (मैक ओएस एक्स 10.8, होमब्रे द्वारा स्थापित जीएनयू सेड):

find . -path ./vendor -prune -o \
  \( -name '*.java' -o -name '*.xml' -o -name '*.css' \) \
  -exec gsed -i -E 's/\t/    /' \{} \; \
  -exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
  -exec gsed -i -E 's/\r\n/\n/' \{} \;

हटाए गए रिक्त स्थान, रिक्त स्थान के साथ टैब की जगह, यूनिक्स के साथ विंडोज सीआरएलएफ की जगह \n

मजे की बात यह है कि सभी फाइलों को साफ करने के gsedनिर्देश से पहले मुझे इसे 3-4 बार चलाना होगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.