Script per spostare file sotto il nome della prima lettera

2

Ho molti file (1000+) in una singola directory, e mi piacerebbe organizzarli in sottodirectory, in base alla loro prima lettera. Quindi ho 200 file che iniziano con A, e vorrei spostarli nella sottodirectory "A", quindi tutti i file "B" ecc.

Come fare?

    
posta stighy 28.05.2012 - 15:32
fonte

3 risposte

5

In un terminale: cd nella directory in questione, quindi

for x in 'ls -1 | sed -e 's/^\(.\).*//' | sort -u'; do
mkdir $x && mv -i ${x}?* $x
done

Ciò presuppone che nessun file abbia un nome di singolo carattere prima di iniziare. Se lo fanno, puoi spostarli da parte prima di eseguire la procedura sopra riportata:

mkdir singles && mv ? singles

e poi spostali verso le loro destinazioni appropriate a poppa.

Modifica: vedi i commenti sotto per alcuni avvertimenti. Se si verificano problemi con righe di comando troppo lunghe, è possibile sostituire la seconda riga con

mkdir $x && find . -maxdepth 1 -name "${x}?*" -exec mv -i {} $x \;
    
risposta data 28.05.2012 - 16:00
fonte
2

Ecco un one-liner Ruby:

ruby -e 'require "FileUtils"; Dir["*"].each { |f| next if File.directory?(f); d = f[0]; Dir.mkdir d rescue nil; FileUtils.mv(f,d) }'

In pratica esegue iterazioni su tutti i file, crea le directory se possibile e sposta i file in seguito.

Esegui questa riga dalla directory.

    
risposta data 28.05.2012 - 23:51
fonte
0

Funzionerebbe anche se i nomi dei file iniziano con caratteri multibyte (come Ä o あ):

ls | iconv -f utf8-mac -t utf-8 | LC_CTYPE=UTF-8 cut -c1 | uniq | while IFS= read -r l; do
  f=("$l"*)
  mkdir -- "$l"
  mv -- "${f[@]}" "$l"
done

iconv -f utf8-mac -t utf-8 converte il testo da una forma parzialmente decomposta usata da HFS + alla forma precomposta. Vedi Codifiche di testo in VFS o questa domanda . LC_CTYPE=UTF-8 rende cut -c1 considera i caratteri multibyte come caratteri singoli.

    
risposta data 19.06.2013 - 21:53
fonte

Leggi altre domande sui tag