Domanda Rinomina in movimento con segnaposto / carattere jolly


Diciamo che ho i seguenti file

/home/user/test1.java
/home/user/test2.java
/home/user/test3.java
/home/user/test1.java.orig
/home/user/test2.java.orig
/home/user/test3.java.orig

Voglio sovrascrivere i file senza il .orig estensione con quei file che lo hanno, ad es /home/user/test1.java.orig -> /home/user/test1.java e così via.

C'è qualche comando come il seguente?

mv /home/user/*.orig /home/user/*

dove posso usare il segnaposto dall'origine nella definizione di destinazione e dove posso specificare che voglio sovrascrivere?


0
2018-02-18 09:02


origine




risposte:


for file in /home/usr/* ; do mv "$file" "${file//.orig/}" ; done

Dovrebbe fare il trucco per te, scorre attraverso tutti i file (e le directory) in / home / user usando l'espansione glob e sostituisce qualsiasi istanza della stringa .orig con niente, quindi lo elimina.

Dovrebbe andare bene fino a quando non hai nessuna sottodirectory con .orig nel loro nome Questo ti darà alcuni messaggi di errore che non sono critici, ma potrebbero essere fastidiosi. Lavorare solo sui file che hanno a .orig estensione è possibile inserire un controllo condizionale se il file ha l'estensione indesiderata:

for file in /home/user/* ; do [[ $file = *.orig ]] && mv "$file" "${file//.orig/}" ; done

2
2018-02-18 09:08



Per ogni file che non è un .orig file (file che si sposteranno su "stesso") verrà prodotto mv: ‘/home/user/X.java’ and ‘/home/user/X.java’ are the same file. Posso sopprimere questo avviso? - Markus Weninger
È possibile inviare STDOUT a /dev/null mettendo 2> /dev/null alla fine del comando. C'è un modo per farlo senza generare l'errore in primo luogo però, metterò insieme una modifica. - Arronical
Grazie, anche per le directory che produrrà mv: cannot move ‘/home/user/dir/’ to a subdirectory of itself, ‘/home/user/dir/’. - Markus Weninger
C'è un comando che non dovrebbe darti errori, quindi non c'è bisogno di reindirizzare lo standard, ho anche citato l'espansione della variabile del file, solo nel caso tu abbia dei file con lo spazio nei nomi. - Arronical
Grazie, ho accettato la tua risposta, tuttavia userò il metodo che ho postato come risposta sotto perché funziona in modo ricorsivo (devo ammettere che mi sono dimenticato di farlo presente nella domanda). Grazie per l'aiuto! - Markus Weninger


for file in $(find /home/user/* -name "*.orig") ; do mv $file ${file//.orig/} ; done

Ciò sposta solo i file con l'estensione specificata e si esegue anche in modo ricorsivo attraverso le sottodirectory.

Se la ricorsione deve essere disattivata, può aggiungere -maxdepth 1 al comando find.


1
2018-02-18 09:24



find è sempre a portata di mano, ha anche un -exec opzione che potresti usare per fare il mv comando, quindi non è necessario eseguire a for ciclo continuo. Potresti anche aggiungere il -type f opzione per la ricerca di trovare di lavorare solo su file. - Arronical
Grazie mille! Sono ancora un principiante e imparo passo dopo passo a migliorare l'uso di Ubuntu :) - Markus Weninger