2013-01-13 8 views
12

ho qualcosa di simile a questo:Rinominare file in più directory per il nome della directory

v_1/file.txt 
v_2/file.txt 
v_3/file.txt 
... 

e voglio di rinominare i file a qualcosa di simile:

v_1.txt 
v_2.txt 
v_3.txt 
... 

nella stessa directory .

Suppongo di poter utilizzare rename ma non riesco a capire come utilizzarlo con la ridenominazione di cartelle e file contemporaneamente.

risposta

19

Il risultato si può ottenere con un bash per il ciclo e mv:

for subdir in *; do mv $subdir/file.txt $subdir.txt; done; 

nota che la soluzione di cui sopra non funziona se il nome della directory contiene spazi. Correlati link.

Un'altra soluzione basata su commenti (che funziona per le directory con spazi nel nome pure):

find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \; 
+0

sembra abbastanza buono – giskou

+0

'$ sottodir 'dovrebbe essere' "$ sottodir" ' e per rimuovere le cartelle vuote ' find. -type d -empty -exec rm -rf \ {\} \; ' – giskou

+0

@giskou Se ti piace digitare.Un singolo 's #/file ##' rinomina è molto più facile da scrivere, ed è al livello di astrazione giusto. Ripetere lo stesso ciclo di shell per tutta la vita per rinominare i file diventa vecchio velocemente. – tchrist

1

sembrano abbastanza semplice per me:

$ mkdir /tmp/sandbox 
$ cd /tmp/sandbox 

$ mkdir v_{1,2,3} 
$ touch v_{1,2,3}/file.txt 

$ rename -v 's#/file##' v_{1,2,3}/file.txt 
rename v_1/file.txt v_1.txt 
rename v_2/file.txt v_2.txt 
rename v_3/file.txt v_3.txt 

$ ls -F 
v_1/ v_1.txt v_2/ v_2.txt v_3/ v_3.txt 
+2

le sottocartelle sono circa 130 e non solo 3: P – giskou

+0

@giskou Non capisco il motivo per cui quello che conta: Stavo semplicemente dimostrando che la tecnica funziona. Il numero di sottodirectory è irrilevante, a meno che non si raggiungano i limiti di 'xargs', e anche questo è banale dato che il Perl' rinomina' leggerà i nomi dei file su stdin. – tchrist

+0

Sono più a bash rispetto a perl e regexps. Se potessi spiegare la tua tecnica in dettaglio ... non so davvero cosa faccia: P – giskou

1

È possibile utilizzare rnm. Il comando sarà:

rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory 

-fo implica file solo modalità.

-dp profondità directory. -1 lo rende ricorsivo a tutte le sottodirectory.

-ns implica il nome stringa il nuovo nome del file.

/pd0/ è la directory padre immediata del file che è soggetta a operazione di ridenominazione.

-ss è una stringa di ricerca (regex). '\.txt$' regex cerca file con .txt alla fine del nome file.

/path/to/the/directory questo è il percorso in cui risiedono le directory v_1, v_2 .... È possibile passare anche le directory (v_1, v_2 ...) al posto del percorso della directory padre. Per esempio:

#from inside the parent directory 
rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' v_*