Коснитесь файлов из Z-> A с задержкой
Вопрос
Мне нужно выполнить перебор нескольких файлов в каталоге в обратном алфавитном порядке с задержкой в 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 )