Linux Redhat에서 지정된 수의 파일을 한 디렉터리에서 다른 디렉터리로 이동 [닫기]

Linux Redhat에서 지정된 수의 파일을 한 디렉터리에서 다른 디렉터리로 이동 [닫기]

실제로 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

이 방법은 이름에 공백이 있는 파일을 처리합니다.

관련 정보