Question

Je dois faire une touche de plusieurs fichiers dans un répertoire dans l'ordre alphabétique inverse, avec un délai de 1 seconde. Ces fichiers ont des espaces dans leurs noms. Je l'ai essayé ceci:
ls | sort -r | tr '\012' '\000' | xargs -0 touch

et ceci:

#!/bin/bash

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

mais la première rend trop vite et ne pas obtenir ce que je veux (les fichiers apparaissent dans l'ordre dans mon appareil), et le second ne gère pas les espaces droit.

Toutes les idées?

Edit: Désolé, oublié d'ajouter que ce serait génial de le faire plus vite possible, parce que si je dois attendre 1 seconde entre les fichiers, et je 60+ fichiers, je ne veux pas attendre plus à 1 minute. Désolé pour la peine.

Était-ce utile?

La solution 3

Enfin je ceci:

#!/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)

J'ai dû inclure le paramètre IFS, comme les guillemets autour fichier $ ne gère pas les espaces très bien.

Merci à tous !!!

Autres conseils

read va lire dans une ligne à la fois:

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

Sinon, vous pourriez mess avec la variable $IFS de sorte que seuls des éléments séparés dans les nouvelles lignes de la syntaxe for i in list, pas d'espaces ou onglets:

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

(Parenthèses ajouté si $IFS est rétablie après. Things'll vont probablement des bananes si vous oubliez et laissez réglé à une valeur non standard.)

Par ailleurs, vous pouvez aussi sauter les sommeils en utilisant touch -t pour définir un horodatage spécifique. Cela semble être un peu plus difficile à faire, cependant, donc je vais laisser un répondeur plus aventureux. : -)

Une autre solution bash:

#!/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

Cela fonctionne pour moi:

while read ; do
    [ -d "$REPLY" ] || touch "$REPLY"
    sleep 1
done < <( find . -maxdepth 1  | sort -r )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top