실제로 X 파일을 한 디렉터리에서 다른 디렉터리로 한 번에 이동하는 방법을 아는 사람이 있습니까? 이 페이지의 모든 "예"에는 오류가 표시되며 쓸모가 없습니다. 한 번에 50개의 파일만 이동할 수 있으며 잠시 동안은 "잠자기" 상태로 있을 수 있습니다. 파일명은 다르지만 확장자는 동일합니다. 내가 말했듯이 모든 "ls" 예제는 Redhat에서 오류를 생성합니다.
답변1
주어진 수의 파일을 한 번에 이동하고 이동 사이에 5초 동안 휴면 상태로 유지하려면 소스 디렉터리에서 다음과 유사한 줄을 사용할 수 있습니다.
while true; do mv -v $(ls -1 *yyy | head -n 5) otherdir/ ; sleep 5; done
이는 yyy
일반적으로 사용되는 파일 확장자와 동일합니다. -n 5
이는 한 번에 5개의 파일을 이동하는 것을 의미하며 otherdir
대상 디렉터리입니다. 요구 사항에 맞게 루프를 조정해야 합니다. 여기에 나열된 대로 모든 소스 파일이 이동되면 오류가 발생합니다.
답변2
확장 및 대상 디렉터리를 허용하도록 조정할 수 있는 작은 스크립트가 작업을 수행합니다.
#!/bin/bash
files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)
while [[ ! -z $files ]]; do
for f in $files; do
mv $f ../t2
done
files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)
done
1,067개의 파일을 생성한 디렉토리에 대해 테스트한 결과 파일이 이동되었습니다.
이 스크립트를 최적화하는 방법이 있다고 확신합니다.
편집하다:
주석에서 지적했듯이 위 스크립트는 공백을 고려하지 않습니다. 공백(그러나 모든 특수 문자가 아닐 수도 있음, 특히 파일 이름의 캐리지 리턴)을 설명하는 방법은 다음과 같습니다.
#!/bin/bash
function move50() {
local NUM=0
find . -name "*.txt" | head -n50 | (while read -r f; do
echo " $f"
mv "$f" ../t2
(( NUM++ ))
done
return $NUM)
}
cntr=1
while [[ $cntr -gt 0 ]]; do
move50
cntr=$?
done
이 방법은 이름에 공백이 있는 파일을 처리합니다.