이름에 공백이 있는 파일을 반복하고, 각 파일의 첫 번째 문자로 새 폴더를 만들고, 파일을 해당 폴더로 이동합니다.

이름에 공백이 있는 파일을 반복하고, 각 파일의 첫 번째 문자로 새 폴더를 만들고, 파일을 해당 폴더로 이동합니다.

현재 디렉터리(이름에 공백 포함)의 파일을 반복하고 파일의 첫 번째 문자(아직 생성되지 않은 경우)로 새 폴더를 만든 다음 이동하는 이 bash 스크립트를 실행하려고 합니다. 해당 폴더에 파일을 넣으세요. 이것은 내 코드입니다.

for i in `/bin/ls | xargs`
do
    dir=`echo "$i" | cut -c 1 -`
    mkdir -m777 -p "$dir"
mv "$i" "$dir"
done

이 문제는 파일의 각 단어를 별도의 파일로 취급하므로 폴더를 올바르게 생성하더라도 파일 이름을 찾는 것은 파일 이름만 찾기 때문에 파일을 해당 폴더로 이동할 수 없다는 것입니다. 실제 파일의 첫 번째 단어. 비슷한 질문에 대한 다른 답변을 살펴봤지만 이것이 제가 얻을 수 있는 가장 가까운 답변입니다.

편집: /bin/ls | xargs @steeldriver의 제안에 따라 " for i in "을 " for i in * "으로 바꾸었고 원래 문제는 해결되었지만 다음과 같은 오류가 발생했습니다.

mv: cannot move '`' to a subdirectory of itself, '`/`'
mv: invalid option -- ' '
mv: missing destination file operand after '-'
mv: invalid option -- '.'
mv: invalid option -- ')'
mv: invalid option -- '+'
mv: cannot move ''$'\340' to a subdirectory of itself, ''$'\340''/'$'\340'
mv: cannot move ''$'\303' to a subdirectory of itself, ''$'\303''/'$'\303'
mv: cannot move ''$'\305' to a subdirectory of itself, ''$'\305''/'$'\305'
mv: invalid option -- '1'

일부 파일이 ASCII가 아닌 문자로 시작하는 것 같습니다(파일이 너무 많아 내용을 볼 수 없습니다). 이러한 상황을 처리할 수 있는 솔루션이 있습니까?

답변1

이름에 공백이 포함된 파일을 반복하려면 셸이면 충분하므로 다음을 호출할 필요가 없습니다 ls.

for    i in *                   # * replaces the complex (and unquoted) `/bin/ls | xargs`
do
       dir=${i%"${i#?}"}        # replaces the slow subshell `echo "$i" | cut -c 1 -`

       echo "$i"                # just to show that an * is enough (and accepts spaces).
done

나열된 모든 파일(디렉토리 포함)을 처리하려면 파일 이름이 파일(디렉토리가 아님)인지 확인하고 디렉터리를 생성하기 전에 해당 디렉터리가 존재하지 않는지 확인해야 합니다.

for i in *
do
    if [ -f "$i" ]; then
        dir=${i%"${i#?}"}
        if [ ! -d "$dir" ]; then
            mkdir -m777 -p "$dir"
        fi
        mv "$i" "$dir"
        if [ "$?" -ne 0 ]; then
            echo "An error occurred moving file \"$i\" to dir \"$dir\""
        fi
    fi
done

답변2

GNU Parallel을 사용하면 다음과 같습니다:

parallel 'mkdir -p {=s/(.).*/$1/=}; mv {} {=s/(.).*/$1/=}' ::: *

(편집: 디렉토리가 아닌 파일을 요청했다는 것을 방금 확인했습니다. / 삭제되었습니다.)

관련 정보