Frage

Ich brauche einen Hauch von mehreren Dateien in einem Verzeichnis in umgekehrter alphabetischer Reihenfolge, mit einer Verzögerung von 1 Sekunde zu tun. Diese Dateien haben Leerzeichen im Namen. Ich habe dies versucht:
ls | sort -r | tr '\012' '\000' | xargs -0 touch

und folgt aus:

#!/bin/bash

for i in $(ls -r); 
do
    touch "$i"
    sleep 1
done

aber die erste macht es zu schnell und nicht bekommen, was ich will (auf die Dateien, um in meinem Gerät erscheinen), und die zweiten Griff nicht die Räume rechts.

Irgendwelche Ideen?

Edit: Sorry, vergaß hinzuzufügen, dass es groß sein würde, dies umso schneller wie möglich zu tun, denn wenn ich 1 Sekunde zwischen Dateien warten, und ich habe 60+ Dateien, ich will nicht mehr warten als 1 Minute. Sorry für die Mühe.

War es hilfreich?

Lösung 3

Schließlich habe ich dies:

#!/bin/bash
(OFFSET_IN_SEC=0
IFS=$'\n'
# for each file in reverse alphabetic order
for file in $(ls -r); do
   # offset in seconds from current time                               
   OFFSET_IN_SEC=$(( $OFFSET_IN_SEC + 1 ))

   # current time + $OFFSET_IN_SEC in format used by touch command
   TOUCH_TIMESTAMP=$(date -d "$OFFSET_IN_SEC sec" +%m%d%H%M.%S)

   # touch me :)
   # NOTE: quotes around $file are for handling spaces
   touch -t $TOUCH_TIMESTAMP "$file"
done)

Ich habe auf die IFS-Einstellung enthalten, da die Anführungszeichen um $ file nicht verarbeitet die Räume in Ordnung.

Danke all !!!

Andere Tipps

read in einer Zeile zu einem Zeitpunkt gelesen werden:

ls -r | while read FILE; do
    touch "$FILE"
    sleep 1
done

Als Alternative könnte man herumspielen mit der $IFS variabel, so dass nur einzelne Elemente in der for i in list Syntax Zeilenumbrüche, keine Leerzeichen oder Registerkarten:

(IFS=$'\n'
for FILE in $(ls -r); do
    touch "$FILE"
    sleep 1
done)

(Die in Klammern hinzugefügt, so wird $IFS wieder danach. Things'll wahrscheinlich Bananen gehen, wenn Sie vergessen, und lassen Sie es auf einen Nicht-Standardwert eingestellt.)

Durch die Art und Weise, Sie könnten auch die Betten überspringen, indem touch -t mit einem bestimmten Zeitstempel zu setzen. Das sieht eher schwieriger zu sein, zu tun, obwohl, so werde ich zu einem Abenteurer Responder verlassen. : -)

Eine andere bash Lösung:

#!/bin/bash
OFFSET_IN_SEC=0

# for each file in reverse alphabetic order
for file in (ls -r); do
   # offset in seconds from current time                               
   OFFSET_IN_SEC=$(( $OFFSET_IN_SEC + 1 ))

   # current time + $OFFSET_IN_SEC in format used by touch command
   TOUCH_TIMESTAMP=$(date -d "$OFFSET_IN_SEC sec" +%m%d%H%M.%S)

   # touch me :)
   # NOTE: quotes around $file are for handling spaces
   touch -t $TOUCH_TIMESTAMP "$file"
done

Dies funktioniert für mich:

while read ; do
    [ -d "$REPLY" ] || touch "$REPLY"
    sleep 1
done < <( find . -maxdepth 1  | sort -r )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top