답변1
코드가 불필요하게 복잡합니다. 문제는 mv
대상 디렉터리가 아직 존재하지 않으면 호출할 수 없다는 것입니다. 또한 콘텐츠를 루트 디렉터리의 디렉터리로 이동하려고 시도하는 것 같습니다.
고려하다
#!/bin/sh
for suffix do
mkdir -p -- "$suffix" || exit 1
mv -- *."$suffix" "$suffix"
done
또는,
#!/bin/bash
suffixes=( "$@" )
for suffix in "${suffixes[@]}"; do
mkdir -p -- "$suffix" || exit 1
mv -- *."$suffix" "$suffix"
done
(디렉토리를 생성할 수 없을 때 스크립트를 종료하는 대신 다음 주어진 접미사로 이동하려면 이를 변경하십시오 exit 1
.)continue
이는 모든 파일 이름 접미사를 반복합니다(실제로는 그렇지 않음).파일 유형"일반 파일", "디렉터리", "기호 링크" 등과 같은 Unix의 파일 형식) 해당 접미사로 명명된 하위 디렉터리가 현재 디렉터리에 생성되고 ."$suffix"
이름이 해당 접미사로 끝나는 모든 파일이 생성됩니다. 접미사는 디렉토리로 이동됩니다.
디렉토리가 이미 존재하는 경우에는 명령이 mkdir -p dirname
실패하지 않습니다 .dirname
예제를 실행하세요:
$ tree
.
|-- file1.mp3
|-- file1.png
|-- file1.txt
|-- file2.mp3
|-- file2.png
|-- file2.txt
|-- file3.mp3
|-- file3.png
|-- file3.txt
|-- file4.mp3
|-- file4.png
|-- file4.txt
|-- file5.mp3
|-- file5.png
|-- file5.txt
`-- script.sh
0 directory, 16 files
$ ./script.sh txt mp3
$ tree
.
|-- file1.png
|-- file2.png
|-- file3.png
|-- file4.png
|-- file5.png
|-- mp3
| |-- file1.mp3
| |-- file2.mp3
| |-- file3.mp3
| |-- file4.mp3
| `-- file5.mp3
|-- script.sh
`-- txt
|-- file1.txt
|-- file2.txt
|-- file3.txt
|-- file4.txt
`-- file5.txt
2 directories, 16 files
답변2
mv 명령을 사용하면 실제로 루트 디렉터리에서 폴더로 이동하려고 시도하는 것입니다. 명령은 현재 디렉터리에서 나와야 합니다.
mv *.${myarray[$index]} ./${myarray[$index]}/
이전 디렉터리를 기록해 두세요 .
. 현재 디렉터리에서 폴더를 찾으라는 메시지가 표시됩니다. 그렇지 않으면 간단히 다음과 같이 작성할 수 있습니다.
mv *.${myarray[$index]} ${myarray[$index]}/
위 명령은 현재 디렉터리의 폴더도 찾습니다.