Benennen Sie Dateien basierend auf einem Teil einer Datei um

1416
random

Wie benenne ich 2009-08-2009-08-13 in 2009-08- $ my_var_till_2009-08-13 für mehrere Dateien um? Der 2009-08-13-Teil ändert sich in Bezug auf das Datum der Datei, daher brauche ich eine Möglichkeit, diesen Teil des Dateinamens zu erfassen. Könnte ich basename irgendwie verwenden?

0
auf welchem ​​Betriebssystem? John T vor 15 Jahren 1
Ich führe dies auf einem Linux-Betriebssystem aus vor 15 Jahren 0

5 Antworten auf die Frage

1
Creepygeek

Wenn die Dateinamen immer in diesem Datumsformat vorliegen, denke ich, dass so etwas (in einem Skript) funktionieren würde - dies setzt natürlich voraus, dass sich alle im selben Verzeichnis befinden und '$ my_var_till' in der Shell definiert ist :

#!/bin/bash  cd <name_of_target_directory>  for i in `ls` do yyyy=`echo $i | awk -F- '`' mm=`echo $i | awk -F- ''` dd=`echo $i | awk -F- ''`  mv $i "$yyyy-$mm-$my_var_till-$yyyy-$mm-$dd" done 

Wenn '$ my_var_till' nicht in der Shell definiert ist, können Sie es als Befehlszeilenargument verwenden (natürlich möchten Sie vielleicht eine Fehlerüberprüfung mit dem Argument hinzufügen):

#!/bin/bash  my_var_till=$1 <continue on with code from above> 
1
apricot boy

Wenn Sie das Dienstprogramm haben rename(es gibt mehrere davon, denke ich, habe ich die Perl-Version):

rename -n -e 's/(\d-\d)-([\d-]+)/$1'"$your_variable"'$2/' * 

Dieses -nFlag bedeutet, dass renamekeine Dateien geändert werden, sondern nur die Änderungen angezeigt werden. Entfernen Sie es, um die Dateien umzubenennen.

0
user7963

mmv kann helfen:

Wenn Sie unter Linux mehrere Dateien umbenennen oder verschieben müssen, wird der Befehl mmv shell Ihnen das Leben erleichtern. Das Dienstprogramm mmv eignet sich auch zum Kopieren mehrerer Dateien, zum Anhängen des Inhalts einer Datei an andere Dateien sowie zum Erstellen von Links.

0
Kevin Fegan

Dieses Skript benennt alle Dateien mit einem Namen wie um

this: 2009-08-2009-08-13 to: 2009-08-$_2009-08-13 

Wenn zum Beispiel my_var_till="whatever"und dateiname = "2009-08-2009-08-13", lautet das Ergebnis:

mv "2009-08-2009-08-13" "2009-08-whatever_2009-08-13" 

Dateien mit Namen, die nicht in diesem Format vorliegen, werden übersprungen.

Versuche dies:

#!/bin/bash  my_var_till="whatever"  for f in * # test if file is proper format echo "$"|grep -E '^[0-9]-[0-9]-[0-9]-[0-9]-[0-9]$'>/dev/null if [ $? -eq 0 ]; then n=$(echo $|sed -r 's/^(.)(.)$/'"\1$_\2/") mv "$" "$" fi done 
-1
John T

Linux:

obligatorischer 1-Liner ...

for i in `ls`;do echo $i | awk -F- '';done 

erweitert

#!/bin/bash my_var_till=somevalue # can replace with $1 to use command-line arg to script for i in `ls` do echo $i | awk -F- '' done 

Sie können auch den renameBefehl verwenden und einen Perl-Regex angeben.

Angenommen, Ihre Variable ist eine Variable, die Sie in der Shell festgelegt haben.

Windows:

2009-08 umbenennen * 2009-08-% my_var_till% _ *