1

ディレクトリ内のいくつかのファイルをアルファベットの逆順に、1 秒の遅延でタッチする必要があります。これらのファイルの名前にはスペースが含まれています。私はこれを試しました:
ls | sort -r | tr '\012' '\000' | xargs -0 touch

この:

#!/bin/bash

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

しかし、最初のものは速すぎて(ファイルがデバイスに順番に表示されるように)欲しいものが得られず、2番目のものはスペースを正しく処理しません。

何か案は?

編集: 申し訳ありませんが、ファイル間で 1 秒待つ必要があり、ファイルが 60 個以上ある場合、1 分以上待ちたくないので、これをできるだけ速く行うことができれば素晴らしいことを追加するのを忘れていました。 . ご迷惑おかけして申し訳ありません。

4

4 に答える 4

3

read一度に1行で読み取ります:

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

これは私のために働く:

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