Tippen Sie Dateien von Z-> A mit einer Verzögerung
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.
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 )