terminale - Script di shell Linux per aggiungere zeri iniziali ai nomi dei file



bash grep (6)

Fornire una soluzione scritta con cautela per essere corretta anche in presenza di nomi di file con spazi:

#!/usr/bin/env bash

pattern='%04d'  # pad with four digits: change this to taste

# enable extglob syntax: +([[:digit:]]) means "one or more digits"
# enable the nullglob flag: If no matches exist, a glob returns nothing (not itself).
shopt -s extglob nullglob

for f in [[:digit:]]*; do               # iterate over filenames that start with digits
  suffix=${f##+([[:digit:]])}           # find the suffix (everything after the last digit)
  number=${f%"$suffix"}                 # find the number (everything before the suffix)
  printf -v new "$pattern" "$number" "$suffix"  # pad the number, then append the suffix
  if [[ $f != "$new" ]]; then                   # if the result differs from the old name
    mv -- "$f" "$new"                           # ...then rename the file.
  fi
done

https://ffff65535.com

Ho una cartella con circa 1.700 file. Sono tutti chiamati come 1.txt o 1497.txt , ecc. Vorrei rinominare tutti i file in modo che tutti i nomi dei file siano lunghi quattro cifre.

23.txt dire, 23.txt diventa 0023.txt .

Che cos'è uno script di shell che farà questo? O una domanda correlata: Come uso grep per abbinare solo le righe che contengono \d.txt (cioè una cifra, quindi un punto, poi le lettere txt )?

Ecco cosa ho finora:

for a in [command i need help with]
do
  mv $a 000$a
done

Fondamentalmente, eseguirlo per tre volte, con i comandi lì per trovare una cifra, due cifre e nomi di tre cifre (con il numero di zeri iniziali modificati).


One-liner:

ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv

Come si usa grep per abbinare solo le righe che contengono \ d.txt (IE 1 cifra, quindi un punto, quindi le lettere txt)?

grep -E '^[0-9]\.txt$'

Provare:

for a in [0-9]*.txt; do
    mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done

Modificare il modello del nome file ( [0-9]*.txt ) secondo necessità.

Una rinomina con enumerazione generica che non fa ipotesi sull'insieme iniziale di nomi di file:

X=1;
for i in *.txt; do
  mv $i $(printf %04d.%s ${X%.*} ${i##*.})
  let X="$X+1"
done

Sullo stesso argomento:


Questa versione supporta anche la gestione delle stringhe prima (dopo) il numero. Ma in pratica puoi fare qualsiasi regex matching + printf a patto che awk lo supporti. E supporta anche i caratteri di spaziatura (eccetto i newline) nei nomi dei file.

for f in *.txt ;do
    mv "$f" "$( 
        awk -v f="$f" '{
            if ( match(f, /^([a-zA-Z_-]*)([0-9]+)(\..+)/, a)) {
                printf("%s%04d%s", a[1], a[2], a[3])
            } else {
                print(f)
            }
        }' <<<''
    )"
done

Supponiamo che tu abbia dei file con datatype .dat nella tua cartella. Basta copiare questo codice in un file chiamato run.sh, renderlo eseguibile eseguendo chmode +x run.sh e quindi eseguire usando ./run.sh :

#!/bin/bash
num=0
for i in *.dat
do

  a=`printf "%05d" $num`
  mv "$i" "filename_$a.dat"
  let "num = $(($num + 1))"
done

Questo convertirà tutti i file nella tua cartella in filename_00000.dat , filename_00001.dat , ecc.


Usando lo script rename ( prename in alcuni casi) che a volte viene installato con Perl, è possibile utilizzare le espressioni Perl per eseguire la ridenominazione. Lo script salta la rinomina se c'è una collisione di nome.

Il comando qui sotto rinomina solo i file con quattro o meno cifre seguite da un'estensione ".txt". Non rinomina i file che non sono strettamente conformi a quel modello. Non tronca i nomi composti da più di quattro cifre.

rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *

Alcuni esempi:

Original    Becomes
1.txt       0001.txt
02.txt      0002.txt
123.txt     0123.txt
00000.txt   00000.txt
1.23.txt    1.23.txt

Altre risposte fornite finora tenteranno di rinominare i file che non sono conformi al modello, producono errori per i nomi di file che contengono caratteri non numerici, eseguono ridenominazioni che producono collisioni di nomi, tentano e non riescono a rinominare i file che hanno spazi nei loro nomi e probabilmente altri problemi.





grep