지연으로 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 설정을 포함시켜야했습니다.
감사합니다 !!!
다른 팁
read
한 번에 한 줄로 읽습니다.
ls -r | while read FILE; do
touch "$FILE"
sleep 1
done
또는, 당신은 주위를 엉망으로 만들 수 있습니다 $IFS
newlines만이에서 분리되도록 변수 for i in list
공백이나 탭이 아닌 구문 :
(IFS=$'\n'
for FILE in $(ls -r); do
touch "$FILE"
sleep 1
done)
(괄호가 추가되었습니다 $IFS
나중에 복원됩니다. 당신이 잊어 버리면 비표준 가치로 설정하면 바나나가 될 것입니다.)
그건 그렇고, 당신은 또한 사용하여 수면을 건너 뛸 수 있습니다. touch -t
특정 타임 스탬프를 설정합니다. 그래도 그렇게하기가 더 어려워 보이므로 더 모험적인 응답자에게 맡길 것입니다. :-)
또 다른 배쉬 솔루션 :
#!/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 )