2017-10-17 1 views
0

Ich habe ein Verzeichnis von Dateien, die ich in eine gegebene Zeichenfolge mit einem Zeitstempel umbenennen muss.For-Schleife löscht Dateien Statt Umbenennen

Ich verwende den folgenden Code ein:

for file in itvl_* 
do 
    mv "$file" "Interval_$(stat -c %Y "$file" | date +%Y%m%d%H%M%S).Interval_001" 
done 

Als ich das Skript in einem Verzeichnis von Dateien ausführen, die die gegebene Maske itvl_ * passen, entfernt es alle bis auf eine oder zwei der Dateien und dann umbenennt erfolgreich die letzte Datei in der Gruppe.

Was könnte hier passieren?

+2

Ihre "Sekunden" reichen nicht aus, um Dateien zu unterscheiden - bash benennt wahrscheinlich die meisten Dateien in derselben Sekunde um und erstellt viele Dateien mit demselben Dateinamen. – Raizuri

+1

'Datum' liest nicht von der Standardeingabe; Sie verwenden nur das aktuelle Datum/die aktuelle Uhrzeit für den neuen Dateinamen. Sie wollen '$ (Datum +% Y% m% d% H% M% S --Datum $ (stat -c% Y" $ Datei "))' 'das Ergebnis von' stat' als Argument für das Datum verwenden '. – chepner

Antwort

1

Es löscht nicht alle Dateien, sondern benennt sie alle zum selben Zielnamen um.

Sie können es sehen, indem Sie:

for file in itvl_* 
do 
    echo "Interval_$(stat -c %Y "$file" | date +%Y%m%d%H%M%S).Interval_001" 
done 

Das Ergebnis ist, dass sie sich gegenseitig aufheben und nur die letzte überlebt.