it-swarm.it

Come sostituire un carattere con un altro in tutti i nomi di file delle directory attuali?

Come rinominare tutti i file/sottocartelle nella cartella corrente?

Diciamo, ho molti file e sottodadi che sono con spazi e voglio sostituire tutti gli spazi con un carattere di sottolineatura.

File 1
File 2
File 3
Dir 1
Dir 3

dovrebbe essere rinominato in

File_1
File_2
File_3
Dir_1
Dir_3
43
NobbZ

Se è necessario rinominare i file anche nelle sottodirectory e find supporta -execdir predicato, quindi puoi farlo

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Grazie a @glenn jackman per aver suggerito -depth opzione per find e per farmi pensare.

Si noti che su alcuni sistemi (inclusi quelli GNU/Linux), find potrebbe non riuscire a trovare file il cui nome contiene spazi e anche sequenze di byte che non formano caratteri validi (tipico con file multimediali con nomi con non- Caratteri ASCII codificati in un set di caratteri diverso da quello della locale). Impostazione delle impostazioni internazionali su C (come in LC_ALL=C find...) affronterebbe il problema.

37
enzotib

In qualsiasi Shell, è possibile eseguire il ciclo sui file il cui nome contiene uno spazio. Sostituire gli spazi con caratteri di sottolineatura è facile in bash, ksh e zsh con ${VARIABLE//PATTERN/REPLACEMENT} costruzione.

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

Su Debian, Ubuntu e derivati, puoi usare Perl rename (altre distribuzioni forniscono un programma diverso come rename, e quel programma non è utile qui).

rename 's/ /_/g' *

Una soluzione zsh obbligatoria:

autoload zmv
zmv '(*)' '${1// /_}'

Una soluzione POSIX obbligatoria:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

Puoi usare rename per questo (qui assumendo quello di util-linux, non quello Perl):

cd /path/to/dir
rename ' ' _ *\ *

Questo troverà tutti gli spazi di file e directory nel nome e sostituirà lo spazio con un carattere di sottolineatura. Poiché utilizza la corrispondenza dei file glob, è necessario essere nella directory giusta per iniziare.

Se vuoi fare corrispondenze ricorsive, puoi, ma potresti dover eseguire rename un paio di volte per catturare tutti gli elementi nelle directory che sono stati rinominati:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
13
Caleb

Un'altra opzione sarebbe mmv, se installata.

mmv \*\ \* \#1_#2
2
glglgl

Su Debian/Ubuntu, basandosi sulle risposte di Caleb e Gilles, questo è ciò che ha funzionato per me nel rinominare i file in modo ricorsivo:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Nota: per visualizzare l'anteprima dei file da rinominare e come, utilizzare -n cambia con rename:

rename -n 's/ /_/g' **

Un'altra nota: l'impostazione globstar rende ** confronta i file in tutte le sottodirectory, quindi se si desidera solo la directory corrente, non impostare globstar o utilizzare * invece di **.

Un'altra nota: il comando rename deve essere eseguito più di una volta per i file con più occorrenze del termine di ricerca.

1
Markus Pscheidt

Se non sei un flash alle espressioni regolari (non lo sono!) E puoi eseguire applicazioni progettate per kde (o usi kde - k desktop o hai le librerie installate), allora krename è una grande utilità grafica che ti consente di vedere prima e dopo prima di impegnarti per le modifiche. Ha una serie di semplici trasformazioni come opzioni e supporta anche espressioni regolari. Puoi anche combinare diverse trasformazioni sequenziali in una rinomina in modo da non dover progettare una singola trasformazione complessa che fa tutto in una volta. Ha anche un'opzione per continuare a rinominare gli stessi file dopo che è stata applicata una ridenominazione.

Non lo uso così spesso, ma quando lo faccio, fa davvero il lavoro rapidamente e facilmente. È davvero utile quando si rinomina vari file multimediali scaricati in modo da poterli gestire in modo uniforme sul proprio sistema. Aiuta a scaricare il manuale di krename separatamente in modo da poter fare riferimento ad esso durante l'utilizzo del programma.

http://www.krename.net/

0
Joe