2013-06-05 16 views
13

Tentativo di rinominare un gruppo di file.Rinominare i file in modo ricorsivo Mac OSX

posso rinominare tutte le istanze di foo con bar nella directory corrente con:

ls . | awk '{print("mv "$1" "$1)}' | sed 's/foo/bar/2' | /bin/sh 

Cosa posso aggiungere per renderlo ricorsiva?

Modifica/La mia soluzione

Non so/capire questa roba tipo shell così ho fatto con un po '(piuttosto sporca) Rubino:

5.times do 
    Dir["**/*"].each do |f| 
    file_name = File.absolute_path f 
    should_rename = file_name.include? "yolo" 
    new_file_name = file_name.gsub("yolo", "#{@project_name}") 
    File.rename(f, new_file_name) if (should_rename and File.exists? f) 
    end 
end 

risposta

0

La risposta alla domanda "come si fa Faccio X in modo ricorsivo su qualche struttura di file "è quasi sempre da usare find. In questo caso forse anche in combinazione con un ciclo for. L'esempio seguente ricorsivamente ricreerà i file corrispondenti al modello foo nella directory corrente.

thedir=./ 
for file in $(find $dir -type f -name foo); do 
    # rename $file here 
done 

A seconda del vostro schema di ridenominazione desiderato e come si desidera esprimere la ridenominazione, il corpo del ciclo avrà diversi comandi ridenominazione (s).

Semplicemente rinominare ogni file denominato foo a bar genererà un file bar e questo non è ciò che la gente di solito desidera. La variabile $file contiene il percorso relativo al file, quindi i diversi bar avranno percorsi diversi.

38

questo è stato chiesto: Recursive batch rename

Con il vostro esempio, si potrebbe andare con:

brew install rename 
find . -exec rename 's|foo|bar|' {} + 
+4

È inoltre possibile filtrare il set di file che verrà sostituito dal nome. Ad esempio, dovevo ricorsivamente rinominare tutti i file * .java in * .txt così l'ho fatto in questo modo: 'find. -name "* .java" -exec rinomina '| \ .java | \ .txt |' {} + ' –

2

L'utilità rename fornisce anche una sintassi che non richiede la conoscenza di espressioni regolari. Dopo aver installato l'utilità

brew install rename 

L'opzione -s sostituirà la prima istanza di foo da bar:

find . -exec rename -s 'foo' 'bar' {} + 

E l'opzione -S sostituirà tutte le istanze:

find . -exec rename -S '_' ' ' {} + 

Questo è davvero la stessa soluzione fornita da Marcel Steinbach sopra, solo una sintassi diversa.