txt 파일에 저장된 파일 목록이 있습니다.
./test7
./test4
./test1
./test5
./test6
./test10
./test8
./test2
./test9
./test3
이 모든 파일에 대해 명령을 실행하고 싶지만 두 파일을 모두 처리한 후 1초 동안 대기하고 싶습니다. 예를 들면 다음과 같습니다.
cp ./test1 test1-backup
cp ./test2 test2-backup
sleep 1
cp ./test3 test3-backup
cp ./test4 test4-backup
sleep 1
...
cp ./test9 test9-backup
cp ./test10 test10-backup
Bash 스크립트를 통해 이를 달성할 수 있는 방법이 있습니까? 1회 반복(sleep 1 호출) 동안 실행되는 명령의 양을 매개변수화하고 싶습니다. 또 다른 문제는 실제 파일 목록이 수십만 줄에 달한다는 점이다.
답변1
나는 당신이 실제 시나리오를 설명하지 않았다고 가정합니다. 수십만 개의 파일을 복사하고 싶을 뿐만 아니라 수십만 초 동안 잠자기를 원할 수도 있습니다... 뭐? ! ?
그래도:
while IFS= read -r file1
IFS= read -r file2
do
cp "$file1" "${file1##*/}-backup"
cp "$file2" "${file2##*/}-backup"
sleep 1
done < inputFile
답변2
죄송합니다:"txt 파일"에 "수십만 줄"이 있다는 것을 눈치 채지 못했습니다. 이것은 단지 순진한 해결책입니다 ...
for a in test*; do ls -l $a; if [[ $((i++ % 2)) != 0 ]]; then sleep 1; fi; done
고쳐 쓰다:설명 및 (부분적으로 파일 이름이 포함된 txt 파일로 업데이트됨)
...재형식:
for a in `cat file.txt`
do
cp "$a" "$a-backup" ## REPLACE THIS LINE
if [[ $((i++ % 2)) != 0 ]] then
sleep 1
fi
done
- 이것이 의미하는 바는
for a in files
파일 $a를 처리하고 행 수가 짝수이면 절전 모드라는 것입니다.
이 줄이 짝수인지 확인하기 위해 개수 를 세고( i++
)i % 2 is 0
- Bash에서 숫자 표현식으로
$(( ...exp ))
평가...exp
- 이 방법은
$((i++ % 2)) != 0
균등한 반복에도 작동합니다(이 경우에는sleep 1
). - Bash에서 부울 표현식으로
[[ ...exp ]]
평가...exp
참고: 이 솔루션은 file.txt
100,000개의 파일이 포함된 파일에는 작동하지만 매우 큰 파일에는 실패합니다.file.txt