Вопрос

Мне нужно выполнить перебор нескольких файлов в каталоге в обратном алфавитном порядке с задержкой в 1 секунду.В названиях этих файлов есть пробелы.Я уже пробовал это:
ls | sort -r | tr '\012' '\000' | xargs -0 touch

и это:

#!/bin/bash

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

но первый делает это слишком быстро и не дает того, что я хочу (чтобы файлы отображались по порядку на моем устройстве), а второй неправильно обрабатывает пробелы.

Есть какие-нибудь идеи?

Редактировать:Извините, забыл добавить, что было бы здорово сделать это как можно быстрее, потому что, если мне придется ждать 1 секунду между файлами, а у меня более 60 файлов, я не хочу ждать больше 1 минуты.Извините за беспокойство.

Это было полезно?

Решение 3

Наконец-то я воспользовался этим:

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

Мне пришлось включить параметр IFS, так как кавычки вокруг $file плохо обрабатывают пробелы.

Спасибо всем!!!

Другие советы

read будет читаться по строчке за раз:

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

В качестве альтернативы, вы могли бы повозиться с $IFS переменная, так что только новые строки разделяют элементы в for i in list синтаксис, а не пробелы или табуляции:

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

(Скобки добавлены таким образом $IFS впоследствии восстанавливается.Скорее всего, все пойдет наперекосяк, если вы забудете и оставите для него нестандартное значение.)

Кстати, вы также можете пропустить время сна, используя touch -t чтобы установить определенную временную метку.Однако, похоже, это сделать гораздо сложнее, так что я оставлю это более предприимчивому ответчику.:-)

Еще одно решение 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

Это работает для меня:

while read ; do
    [ -d "$REPLY" ] || touch "$REPLY"
    sleep 1
done < <( find . -maxdepth 1  | sort -r )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top