触摸Z-> A的文件有延迟

时间:2009-07-23 03:55:29

标签: bash sorting touch sleep

我需要按反向字母顺序在目录中触摸几个文件,延迟时间为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分钟。抱歉,麻烦。

4 个答案:

答案 0 :(得分:3)

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设置特定时间戳来跳过睡眠。但是,这看起来要难得多,所以我会把它留给一个更冒险的响应者。 : - )

答案 1 :(得分:1)

另一个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

答案 2 :(得分:0)

最后我用了这个:

#!/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周围的引号不能很好地处理空格。

全部谢谢!!!

答案 3 :(得分:0)

这对我有用:

while read ; do
    [ -d "$REPLY" ] || touch "$REPLY"
    sleep 1
done < <( find . -maxdepth 1  | sort -r )