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