Elenco di esclusione MV dalla riga di comando


11

Esiste un modo per mv, cpo qualsiasi operazione sui file in modo da poter specificare tutti i file che non si desidera influenzare?

Ad esempio, dire che ho una cartella con i file file1, file2e file3, e voglio spostare file1e file2da qualche parte. Invece di nominare esplicitamente i file per move ( mv file1 file2 /path/to/destination), voglio nominare i file per non spostarli e far spostare tutti gli altri nella cartella ( mv --some-switch file3 /path/to/destination)


Credo che mv file1 file2 /path/to/destinationnon farà quello che vuoi che faccia
phunehehe,

Risposte:


19
  • È possibile utilizzare gli schemi di globbing avanzati in alcune shell per abbinare tutti i file in una directory ad eccezione di quelli che corrispondono ad un particolare schema. Ad esempio, in ksh, bash o zsh, il comando

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    si spostare tutti i file in /sourceal /destinationtranne che per l'abbinamento dei file *.bak. In zsh, puoi anche scrivere /source/^*.bakse esegui per la prima volta setopt extended_glob, e più in generale (richiedendo di nuovo setopt extended_glob) /source/*~*.bak(o /source/a*~*.bakper tutti i file il cui nome inizia con atranne i .bakfile, ecc.).

  • Zsh ha un comando di copia / spostamento / collegamento di massa che può essere utilizzato, tra gli altri, per spostare tutti i file ad eccezione di quelli che corrispondono a un modello. Ad esempio, il comando seguente sposta tutti i file tranne *.bakda /sourcea targete aggiunge .bakal loro nome nel processo:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • Esistono diversi comandi chiamati renamefloating. Su Debian e Ubuntu, /usr/bin/renameè uno script perl che sposta i file su un nuovo nome generato da un'espressione perl. È possibile escludere i file dalla ridenominazione non generando un nuovo nome se il file deve essere escluso. Ad esempio, il seguente comando (utilizzando questo particolare renameprogramma) sposta tutti i file tranne *.bakda /sourcea /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • È possibile utilizzare il findcomando per selezionare i file che si desidera spostare. Ad esempio, il comando seguente sposta tutti i file regolari tranne *.bakin /sourceo in una sottodirectory /target(nota che la struttura della directory è compressa):

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    o (più efficiente se ci sono molti file da spostare)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsyncè una generalizzazione di cpe scpcon regole di inclusione / esclusione molto potenti. Ad esempio, il comando seguente copia tutti i file tranne *.bakin /sourceo una sottodirectory in /target, rispettando la struttura della directory:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • paxè (tra le altre cose) un altro cpsugli steroidi. Le sue regole di esclusione non sono altrettanto potenti di quelle di rsync, ma ha la possibilità aggiuntiva di rinominare i file man mano che vengono copiati. Se si rinomina un file con una stringa vuota, viene escluso dalla copia. Ad esempio, il comando seguente copia tutti i file eccetto *.bakin /sourceo una sottodirectory in /targete rinomina i file .bakin successione.

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    L'esempio sopra ha lo sfortunato effetto collaterale della creazione di directory chiamate foo.bak, che può essere evitato combinando findcon pax:

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    

Eccezionale. Una possibile correzione: penso che il findcomando debba terminare\;
Steven D,

@Steven: Grazie, continuo a dimenticare che puoi usare solo +immediatamente dopo {}.
Gilles 'SO- smetti di essere malvagio' il

bella lista, grazie per quello. :-)
echox

1
che risposta, pollice in alto :)
Dzung Nguyen,
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.