Come rinominare più file in bash (non per modello, ma per richiedere ogni nuovo nome)?


1

Voglio rinominare tutti i file in una directory. I nuovi nomi non seguono alcun modello, quindi non posso usare rename. C'è un modo efficace per farlo, quindi non dovrò usare mv foo.txt bar.txt per ogni singolo file?


Se i nuovi nomi non seguono qualunque modello l'unica cosa che puoi fare è elencare il contenuto della directory in un file e quindi modificare il file per adattarlo.
suspectus

Potresti scrivere il tuo script BASH per chiedere un nuovo nome per ogni file
Wolfizen

5
Per pura fortuna ho scoperto imv (da renameutils) che consente di rinominare interattivamente un file. Ma accetterà solo un file, quindi è necessario un ciclo: for file in *; do imv "$file"; done.
Bobby

Grazie Bobby, è esattamente quello che stavo cercando. Potresti postarlo come risposta, per favore, così posso invogliarti correttamente?
n.st

1
Pinging @Bobby (n.st, devi esplicitamente @ -mentare gli utenti per poter ricevere una notifica).
slhck

Risposte:


3

Quando ho pensato di scrivere questo come una sceneggiatura ho controllato se i nomi possibili sono già stati presi e ho scoperto che la mia "mossa interattiva" è già scritta e pronta per l'uso. Per la maggior parte dei sistemi dovrebbe essere disponibile nel renameutils-package , che contiene vari strumenti che sono molto utili:

  • voto a maggioranza qualificata / QCP : Spostamento rapido / Copia, scrive tutti i nomi di file in un file di testo che può essere modificato.
  • IMV / ICP : Sposta / copia interattiva, richiede il nuovo nome dei file.

Il problema con imv / icp in questo caso è che quelli accettano solo un argomento:

imv FILENAME

Argomenti multipli genereranno un errore. Quindi, in pratica, dovrai riassumere tutto in breve for ciclo continuo:

for file in *; do imv "$file"; done

Ovviamente è difficile da scrivere, quindi dovremmo inserire questo in una funzione pronta per l'uso che possiamo inserire nel nostro .bashrc file.

# Mass Interactive Move
function mimv {
    for file in "$*"; do
        imv "$file"
    done
}

Per fortuna, imv mostra il nome del file che è attualmente in elaborazione, quindi non abbiamo bisogno di alcuna istruzione echo in modo che sappiamo cosa sta succedendo.


3

Puoi usare questo comando:

for i in *; do
   read -p "$i -> " newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

Ti verrà richiesto un nuovo nome per ogni file e anche per ogni directory ( for i in * ) nella directory corrente. Il nuovo nome viene letto $newname. Se colpisci accedere senza digitare un nuovo nome, non viene fatto nulla ( -z $newname controlla, se $newname è vuoto ( z ero); ! è logico not ), altrimenti mv è usato per rinominare il file.


Se vuoi cambiare solo il nome del file, è più efficiente se puoi modificare esso, a partire dal vecchio nome del file, come suggerito da @grawity:

for i in *; do
   read -p "$i -> " -e -i "$i" newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

L'ho provato con nomi di file contenenti spazi e parentesi graffe, tuttavia per favore usalo a tuo rischio (e prima fai un backup dei file originali).


2
Eh, eri più veloce. E hai fatto dei test con gli spazi nei nomi, che ho dimenticato.
Hennes

1
Se usi read -p "$i -> " -e -i "$i" newname, ti permetterà di modificare direttamente il vecchio nome.
grawity

@Hennes: sono stato addestrato da un commento di slhck ( superuser.com/questions/593396/... ) prima di quel giorno ;)
mpy

@grawity: Grazie, è un trucco pulito - l'ho incorporato nella mia risposta.
mpy

@mpy: tranne che tu non l'hai fatto, -e -i "$i" è la parte fondamentale: D
grawity

-1
#!/usr/bin/env bash

for files in $( echo * );
do
     echo -n Rename $files  to which name? ;
     read new_name ;
     mv "$files" "$new_name";
done

2
for files in $(echo *) è molto ridondante - potrebbe essere sostituito con for files in *, che funziona anche correttamente con gli spazi nei nomi.
grawity

Sì. l'ho usato in una versione precedente. Uno che chiedeva un pattern di file in modo da poter usare ./q testfile per rinominare tutti i file che corrispondono a testfile *. Ho tagliato quelle parti prima di postare. (Non era bello come la risposta di mpy è atm, ma mi piace aggiungere piccole cose come se [-z $ 1], quindi echo Usage: $ 0 files per rinominare exit fi
Hennes

if [ -z "$1" ]
grawity
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.