1

我需要在一个目录中按字母倒序处理几个文件,延迟 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

4 回答 4

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设置特定时间戳来跳过睡眠。不过,这看起来更难做到,所以我将把它留给更冒险的响应者。:-)

于 2009-07-23T03:58:05.550 回答
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
于 2009-07-23T15:21:10.437 回答
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 周围的引号不能很好地处理空格。

谢谢大家!!!

于 2009-07-24T15:12:12.100 回答
0

这对我有用:

while read ; do
    [ -d "$REPLY" ] || touch "$REPLY"
    sleep 1
done < <( find . -maxdepth 1  | sort -r )
于 2009-07-25T08:39:44.010 回答