번호가 매겨진 파일 범위를 이동하시겠습니까?

번호가 매겨진 파일 범위를 이동하시겠습니까?

별도의 디렉토리로 이동해야 하는 291개의 번호가 매겨진 파일(001에서 시작하여 291에서 끝나며 제목)이 있습니다. (폴더 1의 경우 001~021, 폴더 2의 경우 022~053이며, 매번 파일 수가 동일할 필요는 없습니다.)

나는 다음과 같은 엉뚱한 방법으로 그것을 할 수 있다고 생각했습니다.ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

나는 더 나은 방법이 있다고 거의 확신합니다. 그렇다면 어떤 방법이 있을까요?

편집: 그러면 괜찮았을 텐데 기억이 나네요...

터미널 사용이 막히지 않아서 파일 관리자를 사용하여 클릭하고 드래그했습니다. 그래도 질문은 여전히 ​​​​있습니다.

답변1

파일을 수동으로 이동해야 하는 것보다 항상 정확히 21개의 파일이 아니라고 말씀하셨기 때문에 효과적으로 수행하려면 다음을 사용할 수 있습니다.버팀대 확장:

mv filename{001..21} dir1
mv filename{022..53} dir2
...

답변2

그러면 설명한 대로 파일이 이동됩니다(두 번째 21개 파일의 경우 두 번째 범위가 022~042라는 점 제외).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

답변3

내 말은 많은 파일(예: 수만 개 또는 백만 개)을 이동한다는 것입니다. {1..20}만 사용하면 쉘이 파일 목록이 너무 길다고 불평할 것입니다.

~ 안에zsh, 당신은mv내장:

setopt Extended_glob zmodload

zsh/파일

그런 다음 다음과 같은 명령을 사용할 수 있습니다.

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

또는 쉘 스크립트를 작성하는 경우 다음과 같이 할 수 있습니다.

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

zsh를 사용하지 않는 경우 다음을 참조하세요.https://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long

관련 정보