Skript zum Verschieben von Dateien unter ihrem Anfangsbuchstaben

2

Ich habe viele Dateien (1000+) in einem einzigen Verzeichnis, und ich möchte sie entsprechend ihrem Anfangsbuchstaben in Unterverzeichnisse unterteilen. Ich habe also 200 Dateien, die mit A beginnen, und ich möchte sie in das Unterverzeichnis "A" verschieben, dann alle "B" -Dateien usw. usw.

Wie macht man ?

stighy
quelle

Antworten:

5

In einem Terminal: also cdin das betreffende Verzeichnis

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

Dies setzt voraus, dass keine Dateien einen einzelnen Zeichennamen haben, bevor Sie beginnen. In diesem Fall können Sie sie zur Seite schieben, bevor Sie das oben beschriebene Verfahren ausführen:

mkdir singles && mv ? singles

und verschieben Sie sie anschließend an die entsprechenden Ziele.

Bearbeiten: In den Kommentaren unten finden Sie einige Einschränkungen. Wenn Sie Probleme mit zu langen Befehlszeilen haben, können Sie die zweite Zeile durch ersetzen

mkdir $x && find . -maxdepth 1 -name "${x}?*" -exec mv -i {} $x \;
Harald Hanche-Olsen
quelle
Dies schlägt fehl, wenn der Name von Dateien Leerzeichen (oder Zeilenumbrüche) enthält. Die Ersetzung von Befehlen kann auch zu zu vielen Argumenten führen.
Slhck
@slhck: Nein, Leerzeichen in Dateinamen sind kein Problem, es sei denn, der Dateiname beginnt mit einem Leerzeichen. Ja, Zeilenumbrüche wären ein Problem, aber beide Fälle sind ausgesprochen ungewöhnlich. Die Ersetzung von Befehlen kann problematisch sein, wenn zu viele Dateinamen mit demselben Buchstaben beginnen. Die derzeitige Begrenzung der Befehlszeilenlänge ist jedoch recht großzügig, sodass dies bei der angegebenen Anzahl von Dateien nicht sehr wahrscheinlich ist. Trotzdem werde ich der Antwort eine Korrektur hinzufügen.
Harald Hanche-Olsen
Ah, ich verstehe jetzt mein schlechtes +1 für dich!
Slhck
2

Hier ist ein Ruby-Einzeiler:

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

Grundsätzlich werden alle Dateien durchlaufen, wenn möglich die Verzeichnisse erstellt und die Dateien anschließend dorthin verschoben.

Führen Sie einfach diese Zeile aus dem Verzeichnis aus.

slhck
quelle
0

Dies würde auch funktionieren, wenn die Dateinamen mit Multibyte-Zeichen beginnen (wie Ä oder あ):

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-8konvertiert Text aus einer teilweise zerlegten Form, die von HFS + verwendet wird, in eine vorkomponierte Form. Siehe Textcodierungen in VFS oder diese Frage . LC_CTYPE=UTF-8macht cut -c1Mehrbytezeichen als einzelne Zeichen betrachten.

Lri
quelle