파일 이름에 공백이 포함된 파일(디렉토리 포함) 찾기 및 이름 바꾸기

파일 이름에 공백이 포함된 파일(디렉토리 포함) 찾기 및 이름 바꾸기

내 ext4 파일 시스템에는 파일 이름에 공백이 있는 파일과 디렉터리가 많이 있습니다.

안전하게 찾아서 이름을 바꾸려면 어떻게 해야 합니까? 나는 bash를 가지고 있고 Ubuntu를 실행하고 있습니다.

발견된 각 파일의 이름을 대화형으로 바꾸는 것이 가능합니까? 즉, 각 파일의 내용 이름을 무엇으로 바꿀 것인지 물어보십시오.

파일 이름을 선택하여 이름을 바꾸려면 어떤 규칙을 사용하시겠습니까?

답변1

이 스크립트는 대상 디렉터리에서 모든 파일을 찾아 공백을 포함하지 않도록 모든 파일의 이름을 바꾸는 새 스크립트를 생성합니다. 그런 다음 스크립트를 실행하기 전에 자유롭게 검토할 수 있습니다.

#!/bin/bash
TARGET=/path/to/files
NEWSCRIPT=${HOME}/rename-spaced-files.sh

OLDIFS="${IFS}"
IFS="\n"
for file in $(find ${TARGET}/ -type f -name "* *"); do
    if [[ -f \"${file// /}\" ]]; then
        echo "# \"${file// /}\" already exists- come up with a new name for it and uncomment the next line" >> $NEWSCRIPT
        echo -n "# " >> $NEWSCRIPT
    fi
    echo "mv \"${file}\" \"${file// /}\"" >> $NEWSCRIPT

done

답변2

각 디렉토리에 대해 이름 바꾸기를 사용하는 것은 간단합니다.

rename 's/\s/_/g' *

이렇게 하면 디렉터리의 파일 이름에서 모든 공백이 제거되고 "_"로 대체됩니다. "g"를 생략하면 파일 이름의 첫 번째 공백만 대체되므로 해당 부분을 잊지 마십시오. *는 실행되는 디렉터리의 모든 파일을 의미합니다.

rename 's/\s/_/g' /home/you/something/*

디렉토리에 있는 파일 이름의 모든 공백을 대체합니다./home/you/something/

여기에는 많은 디렉토리를 순회하는 것이 포함되지 않지만 이것이 제가 일반적으로 수행하는 작업입니다.

나는 밑줄을 좋아합니다. 이렇게 변경됩니다.

my file with spaces.txt

도착하다

my_file_with_spaces.txt

답변3

공백이 포함된 파일 이름은 Unix 및 해당 파일 시스템에서 완벽하게 허용되지만 이를 쉘 명령이나 변수(예: 스크립트)와 함께 사용할 때는 이러한 이름을 인용할 때 주의해야 합니다. 그렇지 않으면 쉘은 각 단어를 별도의 인수로 명령에 전달합니다.

VAR="existing file with spaces in name"

#This works
ls "${VAR}"

#This results in file(s) not found
ls ${VAR}

이미 제공된 답변 외에도 다음을 사용할 수도 있습니다.mmvmmv어쨌든 소스 및 대상 패턴을 인용해야 하므로 이 명령은 이름의 공백에 관계없이 이름이 패턴과 일치하는 여러 파일의 이름을 바꿉니다 .

그리고 뻔뻔하기도 하고내 말을 인용하자면(의도한 말장난은 아니지만 수용됨):

경험 법칙:언제나문자열이 포함된 쉘 변수를 확장할 때 따옴표를 사용하십시오. 공백이 포함되어 있거나 비어 있을 수 있으며, 따옴표가 없으면 전달된 명령이 혼동되는 경우가 많습니다(인수가 너무 많거나 인수가 누락됨).

관련 정보