Posso rendere interattivo `rm` solo quando utilizzo il globbing? (in bash o zsh o entrambi)


15

Ogni volta che ho rmpiù oggetti contemporaneamente con il gorgogliamento della conchiglia e c'è anche la minima possibilità che il modello si espanda a più di quanto mi aspetto, provo sempre a ricordare di aggiungere -i, ma (ovviamente) potrei dimenticare e spazzare via accidentalmente qualcosa di utile. Alcune persone cercano di risolvere questo problema con un alias, come alias rm='rm -i'ma odio l'idea di rendere rm sempre interattivo, perché poi avrò l'abitudine di utilizzare -ftutto il tempo, il che ovviamente vanificherà l'intero scopo.

Quello che mi piacerebbe fare è rmusare solo -iquando uso il globbing e, -fovviamente, per scavalcare -i, così posso ancora spazzare via intere directory con il solito rm -rf junk.

Pertanto rm *blah*sarebbe davvero, rm -i *blah*ma rm blahfunzionerebbe esattamente come digitato.

Nel caso in cui ci sia una differenza nel modo in cui ciò potrebbe essere realizzato in diverse shell, sceglierò una risposta che fornisce metodi sia per bash che per zsh rispetto a risposte che coprono solo l'una o l'altra.


Nota : in realtà non sono convinto che questa sia necessariamente una buona idea; Sto solo chiedendo se è possibile. Se pensi che questa sia un'idea stupida, sarei molto felice di sentire il ragionamento dietro la tua opinione, ma per favore non pubblicare tali commenti nel campo della risposta . Le risposte reali mi dicono come fare o spiegano questo / perché non è possibile (o eventualmente offrono un metodo alternativo per ottenere un risultato simile). Ma se vuoi dirmi perché è stupido, per favore pubblica come commento. Valuterò i commenti ben motivati ​​anche se non sono d'accordo con la conclusione.


7
Alcuni suggerimenti: con le utility GNU, rm -Iè così -iche si innesca solo quando -rvengono passati più di tre file . In bash, utilizzare la Ctrl-x *scorciatoia da tastiera per espandere il glob e ispezionarlo da soli.
jw013,

2
Con bash, credo che la risposta sia "no". Con zsh, potresti essere in grado di trarre vantaggio noglob, ad esempio, da aliasing rm a noglob my-rm, e quindi avere my-rm come uno script che controlla un glob, lo espande e passa -i o no. Non sono sicuro, non so zsh.
derobert,

@derobert: certamente suono come si sa zsh abbastanza bene.
iconoclasta,

@iconoclast No, non zsh, solo Google. Stranamente, ho scoperto che quando provavo a trovare come farlo in bash. :-P
derobert,

Se vuoi qualcosa che assomigli a rm ma che in realtà funzioni in modo diverso, dovrei scrivere uno script (o alias / tasto funzione / funzione) chiamato myrme lasciare che lo script faccia ciò che ti piace.
Walter A

Risposte:


9

Non è facile. Il problema è che quando lo fai:

rm -- *.txt

rm vede solo l'elenco dei file, non lo schema globbing che è già stato espanso dalla shell.

Quello che potresti fare è (zsh):

alias rm='noglob rm'

Questo dice a zsh che i pattern non dovrebbero essere espansi quando si chiama rm. Quindi puoi ridefinire rm come una funzione che fa l'espansione stessa e aggiunge "-i" se è necessario che sia qualcosa del tipo:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

Il problema con questo approccio è che questo nuovo "rm" non vede la differenza tra

rm *

e

rm '*'

Per rimuovere il file chiamato *, dovresti scriverlo:

rm [*]

-1

Funziona in bash, probabilmente in altre shell. Metti nel tuo.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
È possibile utilizzare command rmper evitare l'hard-coding PATH. Inoltre, l'approccio del controllo del conteggio degli argomenti è un po 'inaffidabile, come rmpossono prendere opzioni.
jw013,

1
Dovrebbe essere citato "$ 1", altrimenti fallirà se il singolo file passato contiene uno spazio. @ jw013 - È anche possibile sfuggire al comando, ad esempio\rm
jordanm

@jordanm Hai ragione sulla necessità di citare $1tra virgolette doppie, ma hai torto sul comando di escape. La citazione elimina solo gli alias, NON la ricerca delle funzioni. Questa risposta suggerisce una funzione, non un alias.
jw013,

1
Almeno la vecchia modifica era funzionale: la nuova modifica scarta le opzioni della riga di comando dell'utente, che probabilmente non è la cosa giusta da fare.
jw013,

@ jw013 - Non sapevo che funzionasse solo per le ricerche alias, non per le funzioni. Grazie per l'informazione.
Giordania,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.