Προς το περιεχόμενο

[INFO] Η δύναμη της Κονσόλας


Manos-Sx

Προτεινόμενες αναρτήσεις

  • 2 εβδομάδες αργότερα...
  • Απαντ. 889
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

"I need to delete all files in a directory, but exclude some of them. For example, in a directory with the files a b c ... z, I need to delete all except for u and p. Is there an easy way to do this?"

 

"Type

rm *
, then I press
Ctrl + x
and
*
to expand * into all visible file names.

Then I can just remove the two files I like to keep from the list and finally execute the command line."

 

 

Το Ctrl+x δεν εχω καταλαβει τι ακριβως κανει, γιατι το βλεπω παντα σε συνδυασμο με κατι αλλο. Ξερει κανεις?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

 

rm *
, then I press
Ctrl + x
and
*
to expand * into all visible file names.

Then I can just remove the two files I like to keep from the list and finally execute the command line."

 

Το Ctrl+x δεν εχω καταλαβει τι ακριβως κανει, γιατι το βλεπω παντα σε συνδυασμο με κατι αλλο. Ξερει κανεις?

 

 

Ανάλογα με το συνδυασμό που βλέπεις κάνει και κάποια εργασία. Αν τρέξεις "man bash" και ψάξεις για "C-x" θα δεις πολλούς συνδυασμούς και σε τι function είναι bind ο κάθε συνδυασμός.

 

Ο συνδυασμός του Control + X και μετά αστερίσκος είναι bind στην συνάρτηση glob-expand-word που κάνει δηλαδή επέκταση αρχείων στο κείμενο που βρίσκεται πριν από τον δρομέα. Στην προκειμένη περίπτωση, έχεις γράψει "rm *" οπότε το pattern πάνω στο οποίο καλείται να τρέξει η συνάρτηση είναι ο αστερίσκος. Έτσι θα κάνει επέκταση και θα εμφανίσει στην γραμμή εντολών όλα τα αρχεία δηλαδή η γραμμή εντολών θα γίνει "rm αρχείο1 αρχείο2 κτλ" οπότε πηγαίνεις τον δρομέα στο αρχείο που δεν θέλεις να διαγραφεί και σβήνεις το όνομά του από τη γραμμή εντολών. Έτσι η rm θα λάβει ως ορίσματα μόνο τα αρχεία που θέλεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ανάλογα με το συνδυασμό που βλέπεις κάνει και κάποια εργασία. Αν τρέξεις "man bash" και ψάξεις για "C-x" θα δεις πολλούς συνδυασμούς και σε τι function είναι bind ο κάθε συνδυασμός.

 

Ο συνδυασμός του Control + X και μετά αστερίσκος είναι bind στην συνάρτηση glob-expand-word που κάνει δηλαδή επέκταση αρχείων στο κείμενο που βρίσκεται πριν από τον δρομέα. Στην προκειμένη περίπτωση, έχεις γράψει "rm *" οπότε το pattern πάνω στο οποίο καλείται να τρέξει η συνάρτηση είναι ο αστερίσκος. Έτσι θα κάνει επέκταση και θα εμφανίσει στην γραμμή εντολών όλα τα αρχεία δηλαδή η γραμμή εντολών θα γίνει "rm αρχείο1 αρχείο2 κτλ" οπότε πηγαίνεις τον δρομέα στο αρχείο που δεν θέλεις να διαγραφεί και σβήνεις το όνομά του από τη γραμμή εντολών. Έτσι η rm θα λάβει ως ορίσματα μόνο τα αρχεία που θέλεις.

 

 

sorry, δεν την εγραψα καλα την ερωτηση.. 

 

το παραπανω παραδειγμα ειναι μια ωραια χρηση που βρηκα (ασχετο), καταλαβα τι κανει με το *

 

το ερωτημα ειναι τι κανει το C-x "σκέτο", χωρις συνδυασμό δλδ..??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...
Δημοσ. (επεξεργασμένο)

bashers αυτό δουλευει

sudo  find /path/to/dir -name '*.php' -type f -print0 | xargs -0 sed -i 's/name/sadsadasd/g'

αλλά πως θα γίνει να δουλέψει κ αυτό:

 sudo  find /path/to/dir -name '*.php' -type f -print0 | xargs -0 sed -i 's/['name']/['sFp5Nm4a3']/g'

δοκίμασα να κάνω escape τα quotes με backslashes αλλά δεν π.x

...... sed -i 's/['\''name'\'']/['\''blabla'\'']/g'

ουτε awk με gsub  και octal escaping που είδα κάπου στο net δούλεψε

solved με

sed -i 's/\['\''name'\''\]/\['\''blabla'\''\]/g'
Επεξ/σία από mad-proffessor
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Ενα pattern που να βρισκει md[μονο νουμερα εως 3 ψηφιο αριθμο] ?
 
αυτο δουλευει:

find /dev -name md[0-9] -o -name md[0-9][0-9] -o -name md[0-9][0-9][0-9]

απλα αν γινεται να γραφτει καλυτερα με ενα pattern και οχι 3

 

(θελω να κρατησω την find)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ενα pattern που να βρισκει md[μονο νουμερα εως 3 ψηφιο αριθμο] ?

 

αυτο δουλευει:

find /dev -name md[0-9] -o -name md[0-9][0-9] -o -name md[0-9][0-9][0-9]
απλα αν γινεται να γραφτει καλυτερα με ενα pattern και οχι 3

 

(θελω να κρατησω την find)

 

find /dev -regex "/dev/md[0-9]+"
Το [0-9] δηλώνει το κλασικό range των ψηφίων όπως το έχεις και εσύ. Ο + κάνει match το προηγούμενο pattern όσες φορές να ναι αλλά τουλάχιστον μία φορά οπότε ο συνδυασμός των δύο θα κάνει match μόνο ψηφία όσες φορές και αν υπάρχουν αυτά.

 

Edit: Δεν νομίζω να πηγαίνουν πάνω από τριψήφιο οι md devices οπότε και το γενικό match με το + που έδωσα θα πρέπει να παίζει σωστά. Αν παρόλα αυτά θέλεις να το περιορίσεις, μπορείς να χρησιμοποιήσεις κάτι σαν το παρακάτω.

 

find /dev -regextype posix-extended -regex "/dev/md[0-9]{1,3}"
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 μήνες μετά...

έχω αυτό το script για να κάνω backup

#!/bin/bash

IFS=$'\n'

data="/media/disk320GB/programming
/media/disk320GB/My Pictures
/media/disk320GB/My Music
/media/disk320GB/icedove"

title="rsync backup"

service=''
dest="[email protected]:/media/disk2TB/desktop-backup/"

ok="/usr/share/icons/oxygen/64x64/actions/dialog-ok-apply.png"
error="/usr/share/icons/oxygen/64x64/status/dialog-error.png"
info="/usr/share/icons/oxygen/64x64/status/dialog-information.png"

notify-send $title "Data sync started" -t 3000 -i $info
sleep 5

for line in $data; do 
  rsync -azvr --delete -e "ssh -p 2324" $line $dest >> /tmp/rsync-backup.log && notify-send $title "$line synced" -t 3000 -i $ok || notify-send $title "$line sync failed" -t 3000 -i $error
  sleep 5
done

notify-send $title "Data sync finished" -t 3000 -i $info

το βάζω να τρέχει με anacron

 

δεν παίζει όμως το notify send, και μου φαίνεται οτι μάλλον κάτι γίνεται με την DISPLAY

 

το τρέχω έτσι

env DISPLAY=:0 /media/disk320GB/programming/bash/rsync-backup.sh

μήπως την πάρει αλλά τίποτα

κατα τα άλλα backup κάνει κανονικά

 

τι να κάνω για να παίξει άραγε?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θελω να κανω sort by path ενα array:

BRcustomparts=(/var/tmp=/dev/sdxx /var=/dev/sdxx /var/tmp/mpt=/dev/sdxx)

Το προβλημα μου ειναι οτι η sort σε arch τα βγαζει αναποδα ενω σε debian σωστα (λογω διαφορετικης εκδοσης μαλλον ?)

sorted=($(for i in ${BRcustomparts[@]}; do echo $i; done | sort))
echo ${sorted[@]}

σε arch παιρνω:

/var/tmp/mpt=/dev/sdxx /var/tmp=/dev/sdxx /var=/dev/sdxx

ενω σε debian:

/var=/dev/sdxx /var/tmp=/dev/sdxx /var/tmp/mpt=/dev/sdxx

που ειναι αυτο που θελω.

 

Καποιος αλλος τροπος υπαρχει που να δουλευει σωστα παντου ? (δεν θελω να κανω -r κλπ)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θελω να κανω sort by path ενα array:

BRcustomparts=(/var/tmp=/dev/sdxx /var=/dev/sdxx /var/tmp/mpt=/dev/sdxx)
Το προβλημα μου ειναι οτι η sort σε arch τα βγαζει αναποδα ενω σε debian σωστα (λογω διαφορετικης εκδοσης μαλλον ?)

sorted=($(for i in ${BRcustomparts[@]}; do echo $i; done | sort))
echo ${sorted[@]}
σε arch παιρνω:

/var/tmp/mpt=/dev/sdxx /var/tmp=/dev/sdxx /var=/dev/sdxx
ενω σε debian:

/var=/dev/sdxx /var/tmp=/dev/sdxx /var/tmp/mpt=/dev/sdxx
που ειναι αυτο που θελω.

 

Καποιος αλλος τροπος υπαρχει που να δουλευει σωστα παντου ? (δεν θελω να κανω -r κλπ)

 

Μπορείς να τρέξεις locale και να δεις τι χρησιμοποιεί η κάθε διανομή ?

 

Με οποιοδήποτε locale πέραν του βασικού
% export LC_COLLATE=en_US (ή el_GR ή el_GR.UTF-8 ή οτιδήποτε)
% for i in ${BRcustomparts[@]}; do  
echo $i  
done|sort                                
/var=/dev/sdxx
/var/tmp=/dev/sdxx
/var/tmp/mpt=/dev/sdxx

Με το βασικό locale
% export LC_COLLATE=C (ή LC_COLLATE=POSIX ή unset LC_COLLATE)
% for i in ${BRcustomparts[@]}; do
echo $i
done|sort
/var/tmp/mpt=/dev/sdxx
/var/tmp=/dev/sdxx
/var=/dev/sdxx
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

στο arch εχω:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE=C
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

οντως αν δωσω unset LC_COLLATE το βγαζει κανονικα

 

Thanks!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

χμμ παλι κανει οτι θελει

BRcustomparts=(/var/cache=/dev/sdxx /var=/dev/sdxx /var/cache/pacman=/dev/sdxx)

μου βγαζει και στις 2 διανομες με unset LC_COLLATE:

/var/cache=/dev/sdxx /var/cache/pacman=/dev/sdxx /var=/dev/sdxx

χωρις unset LC_COLLATE μου τα βγαζει sorted αλλα αναποδα:

/var/cache/pacman=/dev/sdxx /var/cache=/dev/sdxx /var=/dev/sdxx

Αν βγαλω το = και οτι εχει μετα, τα βγαζει κανονικα χωρις να πειραξω την LC_COLLATE. Υπαρχει τροπος να πω στην sort να αγνοει αυτο το μερος (=/dev/sdxx) ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

χμμ παλι κανει οτι θελει

BRcustomparts=(/var/cache=/dev/sdxx /var=/dev/sdxx /var/cache/pacman=/dev/sdxx)
μου βγαζει και στις 2 διανομες με unset LC_COLLATE:

/var/cache=/dev/sdxx /var/cache/pacman=/dev/sdxx /var=/dev/sdxx
χωρις unset LC_COLLATE μου τα βγαζει sorted αλλα αναποδα:

/var/cache/pacman=/dev/sdxx /var/cache=/dev/sdxx /var=/dev/sdxx
Αν βγαλω το = και οτι εχει μετα, τα βγαζει κανονικα χωρις να πειραξω την LC_COLLATE. Υπαρχει τροπος να πω στην sort να αγνοει αυτο το μερος (=/dev/sdxx) ?

 

Ναι το συγκεκριμένο και εμένα μου το βγάζει έτσι ανεξαρτήτως LC_COLLATE. Γενικά πάντως να επιβεβαιώνεις με locale ότι έγινε η αλλαγή. Μπορεί για παράδειγμα αν είναι ενεργοποιημένη η LC_ALL, το unset LC_COLLATE να μην έχει αποτέλεσμα γιατί παίρνει την τιμή της LC_ALL.

 

Για τους κανόνες collation της glibc υπάρχουν bugs για πολλά χρόνια αλλά δεν ξέρω γιατί δεν φτιάχνονται. Παλιά θυμάμαι είχε γίνει ντόρος για κάτι στα Ελληνικά αλλά δεν μπορούσε να αλλάξει γιατί έτσι το όριζε το Unicode ή κάτι τέτοιο δεν θυμάμαι.

 

Δες τι παίρνω στο repository του Slackware.

με LC_COLLATE=C
% find | sort
./PACKAGES.TXT
./a/openssl-solibs-1.0.1e-x86_64-1.txz
./a/patch-2.7-x86_64-2.txz
./ap/a2ps-4.14-x86_64-5.txz
./n/zd1211-firmware-1.4-fw-1.txz

με LC_COLLATE=el_GR.UTF-8 ή οποιοδήποτε άλλο εκτός C, POSIX
% find | sort
./a/openssl-solibs-1.0.1e-x86_64-1.txz
./ap/a2ps-4.14-x86_64-5.txz
./a/patch-2.7-x86_64-2.txz
./n/zd1211-firmware-1.4-fw-1.txz
./PACKAGES.TXT
Χωρίς να είμαι σίγουρος, από όσες φορές έχω χρησιμοποιήσει την sort, έχω σχηματίσει την εντύπωση ότι στα locale πέραν του βασικού ισχύουν κάποιοι κανόνες που δεν περιμένουμε όπως τα κεφαλαία και τα μικρά να έχουν ίδια προτεραιότητα και να μη λαμβάνονται υπ' όψιν κάποιοι χαρακτήρες όπως πχ ο /. Αν αφαιρέσουμε τον /, τότε apa2 (ap/a2ps) είναι όντως πιο μπροστά από το apat (a/patch).

 

Το ίδιο ίσως να γίνεται και σε σένα.

/var/cache=/dev/sdxx
/var/cache/pacman=/dev/sdxx
/var=/dev/sdxx
Αν δούμε το παραπάνω ως

 

/varcachedevsdxx
/varcachepacmandevsdxx
/vardevsdxx
η ταξινόμηση είναι σωστή. Δεν ξέρω τι παίζει και πώς λύνεται. Δεν σε βολεύει να έχεις τον πίνακα χωρίς το =/dev/sdxx και να το κάνεις append αφού κάνεις την ταξινόμηση ?
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...