Linux에서 파일 이름의 공백을 처리하는 방법

0
356

Linux에서 파일 이름의 공백을 처리하는 방법
fatmawati achmad zaenuri/Shutterstock.com
Linux 시스템에 공백이 있는 파일 이름이 있는 경우 파일 이름을 따옴표로 묶으면 Bash가 올바르게 처리할 수 있습니다. 탭 완성 기능을 사용하면 공백이 포함된 경우에도 명령줄에 파일 이름을 쉽게 입력할 수 있습니다.

대부분의 운영 체제와 마찬가지로 Linux는 공백이 있는 파일 이름을 지원합니다. 그러나 명령줄에서 이러한 파일 이름을 사용하는 것이 항상 간단한 것은 아닙니다. 다음은 공백이 포함된 파일 이름을 처리할 수 있는 몇 가지 방법입니다.

목차

겸손한 파일 이름
Linux 파일 이름의 공백이 문제인 이유
공백을 인용하고 이스케이프 처리하는 방법
소스에서 공간 문제를 해결하는 방법
탭 확장으로 공간 처리가 쉬워집니다.
Bash 스크립트에서 공백이 있는 파일 이름을 사용하는 방법
간격이 있지만 벗겨지지 않음

겸손한 파일 이름

컴퓨터의 하드 드라이브에 저장된 모든 항목에는 이름이 있어야 합니다. 이름이 없으면 파일도 존재하지 않습니다. 컴퓨터가 부팅될 때 실행되는 모든 응용 프로그램과 데몬, 그리고 사용하는 모든 소프트웨어는 식별되어 파일 시스템에 저장되어야 합니다. 그 식별은 파일의 이름입니다.’

Linux에서 "모든 것이 파일입니다"는 무엇을 의미합니까?

관련된Linux에서 “모든 것이 파일입니다”는 무엇을 의미합니까?

생성하거나 설치하는 파일에도 동일한 사항이 적용됩니다. 모든 문서, 이미지 및 음악에는 파일 이름이 필요합니다. 파일 이름이 없으면 디지털 자산이 존재할 수 없습니다. 파일 이름은 매우 중요하기 때문에 Linux는 구성에 대해 가능한 한 적은 규칙을 적용하려고 노력합니다.

Linux에서 파일 이름은 슬래시 “를 제외한 모든 문자를 포함할 수 있습니다./” 및 null 문자, 0x00. null 문자는 문자열의 끝을 표시하는 데 사용되므로 문자열 자체에 존재할 수 없습니다. 그렇지 않으면 Linux는 null 문자 위치에서 파일 이름을 자릅니다. “/” 슬래시는 디렉터리 경로에서 구분 기호로 사용됩니다.

파일 이름은 대소문자를 구분하며 null 문자를 포함하여 최대 255바이트까지 가능합니다. 디렉토리 경로는 null 문자를 포함하여 최대 4096바이트까지 가능합니다. 이것은 길이입니다. 바이트이는 다음과 직접적으로 동일하지 않을 수 있습니다. 문자. 예를 들어 16비트 유니코드 문자는 각각 2바이트를 사용합니다.

레트로 컴퓨팅 애호가와 오랜 기억력을 가진 사람들은 개인용 컴퓨터 초기에 Microsoft의 디스크 운영 체제인 DOS가 대소문자를 구분하지 않고 파일 이름이 8자로 제한되었고 확장자가 3자로 제한되었음을 알 것입니다.

파일 이름을 지정할 때 매우 사려 깊고 때로는 창의적이어야 했습니다. 이에 비해 오늘날 우리가 누리는 자유는 파일에 대해 생성하는 설명 외에는 거의 생각하지 않고 원하는 대로 파일 이름을 지정할 수 있음을 의미합니다.

그러나 파일 이름에서 가장 자주 걸려 넘어지는 것은 입력하는 문자가 아니라 문자 사이의 공백입니다.

Linux 파일 이름의 공백이 문제인 이유

Bash와 같은 쉘은 공백으로 구분된 문자열을 단일 인수가 아닌 개별 명령 인수로 해석합니다. 다음은 다음을 사용하는 예입니다. touch “my new file.txt”라는 새 파일을 만듭니다.

touch my new file.txt
ls

이름에 공백이 있는 파일을 만들기 위해 터치를 사용하려고 합니다.

보시다시피, ls 하나는 “my”, 다른 하나는 “new”, 다른 하나는 “file.txt”라는 세 개의 파일이 생성되었음을 보여줍니다.

참고 touch 불평하거나 오류를 던지지 않았습니다. 그것은 우리가 요구한다고 생각하는 것을 수행합니다. 따라서 자동으로 명령줄로 돌아갑니다. 확인할 동기가 없다면 일이 계획대로 진행되지 않았는지 알 수 없습니다.

원하는 파일을 만들려면 인용하거나 이스케이프 처리해야 합니다.

공백을 인용하고 이스케이프 처리하는 방법

전체 파일 이름을 인용하면 touch 인용된 텍스트를 단일 인수로 취급해야 한다는 것을 알고 있습니다.

touch 'my new file.txt'
ls

전체 파일 이름을 따옴표로 묶어 이름에 공백이 있는 파일을 만들기 위해 터치를 사용합니다.

이번에는 우리가 기대하는 단일 파일을 얻습니다.

백슬래시 문자 “를 사용하면 동일한 결과를 얻을 수 있습니다.” 공간을 탈출합니다. 특수 문자(즉, 인수 구분 기호)로 취급되지 않는 공백을 “이스케이프”하면 일반 공백으로 간주됩니다.

touch my second new file.txt
ls

터치를 사용하여 백슬래시로 이스케이프된 이름에 공백이 있는 파일 생성

작동하지만 공백을 이스케이프 처리하면 파일 이름을 입력하는 속도가 느려지고 오류가 발생하기 쉽습니다. 디렉토리 이름에 공백이 포함되어 있으면 상황이 정말 엉망이 될 수 있습니다.

cp dir one/my text file.txt dir two/my text file.bak
ls

명령에서 이스케이프된 공백을 사용하여 한 디렉터리에서 다른 디렉터리로 파일 복사

이 명령은 “dir one”이라는 디렉터리에서 “dir two”라는 디렉터리로 단일 텍스트 파일을 복사하고 사본을 BAK 파일로 저장합니다. 아주 간단한 예입니다.

소스에서 공간 문제를 해결하는 방법

자신의 파일인 경우 공백을 사용하지 않도록 정책을 결정하고 이와 같은 파일 이름을 생성(또는 대량 이름 바꾸기)할 수 있습니다.

mynewtextfile.txt

틀림없이 그것은 강력한 솔루션이지만 여전히 추악합니다. 대시 사용과 같은 더 나은 옵션이 있습니다.-” 또는 밑줄 “_” 당신의 단어를 분리합니다.

my-new-text-file.txt
my_new_text_file.txt

이 두 가지 모두 문제를 회피하고 읽을 수 있습니다. 파일 이름에 추가 문자를 추가하지 않으려면 다음과 같이 CamelCase를 사용하여 파일 이름을 읽을 수 있도록 할 수 있습니다.

MyNewTextFile.txt

탭 확장으로 공간 처리가 쉬워집니다.

물론 명명 규칙을 채택하고 이를 고수하는 것은 자신의 파일을 다룰 때만 도움이 됩니다. 다른 곳에서 가져온 파일은 채택된 명명 규칙을 따르지 않을 것입니다.

탭 확장을 사용하여 파일 이름을 정확하게 “작성”할 수 있습니다. 다음을 사용하여 “dir two”에서 생성한 BAK 파일을 삭제하고 싶다고 가정해 보겠습니다. rm.

“rm dir”을 입력하여 시작합니다. rm 명령을 사용하면 디렉터리 이름이 “dir”로 시작한다는 것을 알 수 있습니다.

rm dir

탭 완성을 사용하기 위해 탭을 누르기 전에 명령의 시작 부분 입력

“Tab” 키를 누르면 Bash가 현재 디렉터리에서 일치 항목을 검색합니다.

탭을 누르면 부분 디렉토리 경로에 백슬래시와 공백이 추가되었습니다.

“dir”로 시작하는 두 개의 디렉토리가 있으며 두 경우 모두 다음 문자는 공백입니다. 따라서 Bash는 백슬래시 문자 “를 추가합니다.” 그리고 공백. 그런 다음 Bash는 우리가 다음 문자를 제공할 때까지 기다립니다. 이 디렉토리에서 가능한 두 일치 항목을 구분하려면 다음 문자가 필요합니다.

“t”(“two”)를 입력한 다음 “Tab”을 한 번 더 누릅니다.

"t"를 입력하고 탭을 누른 후의 디렉토리 경로

Bash는 디렉토리 이름을 완성하고 파일 이름의 시작 부분을 입력하기를 기다립니다.

이 디렉토리에는 하나의 파일만 있으므로 파일 이름의 첫 글자인 “m”을 입력하면 Bash가 사용할 파일을 알 수 있습니다. “m”을 입력하고 “Tab”을 누르면 파일 이름이 완성되고 “Enter”는 전체 명령을 실행합니다.

전체 파일 이름은 "m"을 누르고 Tab 키를 누르면 완성됩니다.

탭 확장을 사용하면 파일 이름이 올바른지 쉽게 확인할 수 있으며 일반적으로 명령줄에서 탐색 및 입력 속도가 빨라집니다.

관련된: 탭 완성 기능을 사용하여 모든 운영 체제에서 명령을 더 빠르게 입력

Bash 스크립트에서 공백이 있는 파일 이름을 사용하는 방법

스크립트가 파일 이름의 공백과 관련하여 명령줄과 정확히 동일한 문제를 가지고 있다는 것은 놀라운 일이 아닙니다. 파일 이름을 변수로 전달하는 경우 변수 이름을 인용해야 합니다.

이 작은 스크립트는 파일 패턴 “*.txt”와 일치하는 파일이 있는지 현재 디렉토리를 확인하고 이를 라는 변수에 저장합니다. file_list. ㅏ for 루프는 각각에 대해 간단한 작업을 수행하는 데 사용됩니다.

#!/bin/bash

file_list=*.txt

for file in $file_list
do
  ls -hl $file
done

이 텍스트를 편집기에 복사하고 “files.sh”라는 파일에 저장합니다. 그런 다음 chmod 실행할 수 있도록 하는 명령입니다.

chmod +x files.sh

chmod를 사용하여 스크립트를 실행 가능하게 만들기

이 디렉토리에 몇 개의 파일이 있습니다. 하나는 간단한 파일 이름을 가지고 있고 다른 두 개는 밑줄을 사용합니다._” 또는 대시 “-” 공백 대신. 이것은 우리가 스크립트를 실행할 때 우리가 보는 것입니다.

./files.sh

공백이 포함되지 않은 파일 이름으로 files.sh 스크립트 실행

잘 작동하는 것 같습니다. 그러나 이름에 공백이 포함된 파일에 대해 디렉터리의 파일을 변경해 보겠습니다.

./files.sh

공백이 포함된 파일 이름으로 files.sh 스크립트 실행

각 파일 이름의 모든 단어는 자체적으로 파일 이름인 것처럼 처리되므로 스크립트가 실패합니다. 그러나 스크립트가 파일 이름의 공백을 처리하도록 하려면 다음을 인용하기만 하면 됩니다. $file 내부 변수 for 고리.

#!/bin/bash

file_list=*.txt

for file in $file_list
do
ls -hl "$file"
done

달러 기호 “$“는 따옴표 안에 있습니다. 변경 사항을 적용하고 “files.sh” 스크립트 파일에 저장했습니다. 이번에는 파일 이름이 올바르게 처리됩니다.

./files.sh

파일 이름에 공백이 있는 파일을 올바르게 처리하는 수정된 files.sh 스크립트

관련된: Linux Bash 스크립트에서 파일을 한 줄씩 처리하는 방법

간격이 있지만 벗겨지지 않음

자신의 파일 이름에 공백을 피하는 것은 지금까지만 가능합니다. 이름에 공백이 포함된 다른 소스의 파일을 접하게 되는 것은 불가피합니다. 고맙게도 명령줄이나 스크립트에서 해당 파일을 처리해야 하는 경우 쉽게 처리할 수 있는 방법이 있습니다.

관련된: 개발자와 매니아를 위한 최고의 Linux 노트북