나한테 뭔가 이상한 일이 벌어지고 있어요. 나는 매우 간단한 스크립트를 사용하여 일부 디렉토리를 생성합니다.
...모든 디렉토리를 생성합니다(올바른 권한이 있는 사용자로 실행). 예:
mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre
하지만 내가 얻는 디렉토리는 두 배입니다! 내가 이것을 할 때 ls -lrt
나는 얻는다.
uxel081c: wmb - /home/EAI003A/05_EDSNFE/EAI2ISU/VEA # ls -lrt
total 0
drwxr-xr-x 2 wmb mqbrkrs 256 Jan 28 15:25 tre
drwxr-xr-x 2 wmb mqbrkrs 256 Jan 28 15:25 err
drwxr-xr-x 2 wmb mqbrkrs 256 Jan 28 15:25 arc
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 tre
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 tbt
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 err
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 arc
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 13 10:49 tbt
(이중 주의특수, TBT, 아크...)
이중 디렉터리는 동일한 데이터를 가리킵니다.
일반적인 일을 하면 ls
얻는다.
uxel081c: wmb - /home/EAI003A/05_EDSNFE/EAI2ISU/VEA # ls
tre tre
따라서 디렉토리는 두 개뿐입니다!
무슨 일이야?
답변1
추측을 해야 한다면 이 파일과 파일 이름에 인쇄할 수 없는 문자가 포함되어 있다는 사실에 회의적일 것입니다. 다음 스위치를 사용하여 이러한 특수 문자를 표시할 수 있습니다 ls
.
Locating "non-printing" characters in file names
The ls command has all the options you need to detect "hidden" characters:
Command Function Sample Output
------- -------- ------ ------
ls hides/interprets nongraphic characters zzz
ls -b prints octal codes for nongraphic characters zzz\010\010\010aaa
ls -q prints question marks for nongraphic characters zzz???aaa
이러한 유형의 문자 및 이동 가능 문자에 대한 자세한 내용은 위에 참조된 페이지를 참조하세요.
답변2
내 생각엔 당신이 어느 시점에 Windows에서 스크립트를 편집했고 그 버전은Windows 라인 종결자: CR(캐리지 리턴) 다음에 LF(줄 바꿈)가 옵니다. Unix 쉘의 경우 LF는 줄 종결자이고 CR은 일반 문자입니다. 따라서 스크립트에 다음이 있는 경우(여기서 ␍는 CR 문자임):
mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre␍
그런 다음 편집기에서 다음을 볼 수 있습니다.
mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre
그러나 쉘은 명령 mkdir
이 매개변수 -p
및 /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre␍
.
CR 문자가 터미널에 인쇄되면 그 효과는 커서를 줄의 시작 부분으로 이동시키는 것입니다. 사용 시 ls -l
CR은 줄 끝 부분에만 나타나므로 눈에 보이는 효과는 없습니다. plain 의 경우 ls
끝에 CR
있는 두 번째 파일 이름마다 다음 파일 이름 쌍이 이전 줄을 덮어쓰게 됩니다.
다음 명령 중 하나를 사용하여 Unix 줄 끝을 사용하도록 스크립트를 변환합니다.
dos2unix /path/to/script # if dos2unix is available
sed -i -e $'s/\r//' /path/to/script # on Linux or Cygwin only
perl -i -e 's/\r$//' /path/to/script
편집자에게도 이 작업을 수행할 수 있는 방법이 있을 수 있습니다. 편집기에서 쉘 스크립트를 편집할 때 행이 "CRLF", "Windows" 또는 "DOS"가 아닌 "LF", "Unix" 또는 "Linux"로 끝나는지 확인하십시오.
UNIX 변형에 따라 파일 이름에 특수 문자를 표시해 보십시오 ls -b
. 두 디렉터리를 병합하려면 먼저 파일을 올바른 디렉터리로 이동한 다음 다른 디렉터리를 삭제하세요.ls -Q
ls -q
mv -i tre/* tre?/
rmdir tre?/