파일 이름에 줄바꿈을 추가하려면 "mv"를 사용하세요.

파일 이름에 줄바꿈을 추가하려면 "mv"를 사용하세요.

이것은 심각한 질문입니다. 일부 awk스크립트를 테스트하고 있는데 이름에 줄바꿈이 포함된 파일이 필요합니다.


를 사용하여 파일 이름에 줄 바꿈을 추가할 수 있습니까 mv?

나는 지금 이것을 할 수 있습니다 touch:

touch "foo
bar"

터치 방식으로 복사하고 붙여넣을 때마다 줄 바꿈을 추가했습니다. 하지만 fooReturnbar쉘에는 쓸 수 없습니다 .

파일 이름에 개행 문자를 포함하도록 파일 이름을 바꾸려면 어떻게 해야 합니까?


2015년 6월 28일 오후 7시 8분에 수정됨;

I에 개행 문자를 추가하려면 +를 zsh사용할 수 있습니다 .AltReturn

답변1

이것은 나쁜 생각이지만(파일 이름에 이상한 문자가 포함되어 있음) 이렇게 할 수 있습니다.

 mv somefile.txt "foo
 bar"

mv somefile.txt "$(printf "foo\nbar")"(완료 하거나 기다릴 수도 있습니다 mv somefile.txt foo$'\n'bar... 세부 사항은 쉘에 따라 다릅니다. 저는 하나를 사용하고 있습니다 zsh)

자세히 알아보기와일드카드,예를 들어글로벌(7). 세부사항은 쉘에 따라 다를 수 있습니다. 그러나 이것이 /bin/mv (쉘에서) 다음을 통해 제공된다는 점을 이해하십시오.실행(2), 하나확장하다매개변수 배열: 매개변수 확장 및 와일드카드는 호출 셸에서 담당합니다.

동일한 작업을 수행하기 위해 작은 C 프로그램을 작성할 수도 있습니다.

#include <stdio.h>
#include <stdlib.h>
int main() {
  if (rename ("somefile.txt", "foo\nbar")) {
     perror("rename somefile.txt");
     exit(EXIT_FAILURE);
  };
  return 0;
}

위 프로그램을 에 저장 foo.c하고 컴파일하고 gcc -Wall foo.c -o foo 실행하세요../foo

마찬가지로 Perl, Ruby, Python, Ocaml 등을 사용하여 유사한 스크립트를 작성할 수 있습니다.

그러나 이것은 나쁜 생각이다.파일 이름에 줄바꿈을 피하세요(사용자를 혼란스럽게 하고 많은 스크립트가 중단될 수 있습니다.)

실제로 파일 경로에는 악센트가 없는 문자, 숫자, +-/._% 문자( / 디렉토리 구분 기호) 만 사용하는 것이 좋습니다. "숨겨진" 파일( 로 시작 .)은 주의해서 사용해야 합니다. 파일 이름에 어떤 종류의 공백도 사용하는 것은 잘못된 것 같아요. 밑줄(예: foo/bar_bee1.txt) 또는 빼기 기호(예: foo/bar-bee1.txt) 를 사용하세요.

답변2

Bash를 사용하는 경우 이 명령이 작동합니다.

mv a $'b\nc'

답변3

mv귀하가 해결책을 요청했다는 것을 알고 있지만 , 주의 사항에도 불구하고 이 작업은 renamePerl 패키지에서 쉽게 수행할 수 있습니다.

~/tmp$ touch foo
~/tmp$ rename 's/$/\nbar/' foo
Unsuccessful stat on filename containing newline at /usr/share/perl5/File/Rename.pm line 69.
~/tmp$ ls
foo?bar

답변4

이 문제의 한 측면은 실제로 쉘과 관련이 없으며 awk쉘에만 관련이 있습니다. 문제는 표준 표준 tty에서 대부분의 경우 커널의 tty 규칙이 입력을 버퍼링하여 다른 곳이 아닌 화면에 에코하여 백스페이스 등을 효율적으로 처리할 수 있다는 것입니다.

그러나 Enter 키를 누르거나 개행 문자를 입력하면 버퍼링된 모든 데이터가 즉시 읽기 응용 프로그램(일반적으로 셸)으로 푸시됩니다. $PS2내어쓰기를 입력한 후 관찰하면 이를 관찰 할 수 있습니다 . 쉘이 인쇄할 때 $PS2이는 입력의 일부 덩어리를 읽었지만 아직 완료되었는지 확신하지 못하기 때문입니다.

\n따라서 편의를 위해 다른 모든 입력을 한 번에 푸시할 필요 없이 ewline을 터미널 버퍼로 보낼 수 있는 방법이 필요합니다 . 표준 방법은 키 시퀀스를 사용하는 것입니다.CTRL+V- 어느인용 부호터미널의 경우 다음 입력 문자입니다. 하다CTRL+V그 다음에CTRL+J- 후자가 일반적으로 텍스트를 \newline으로 입력하는 방식이기 때문입니다. $PS2쉘이 아직 입력을 읽지 않았기 때문에 보이지 않을 때 작동했다는 것을 알 수 있습니다 .

하지만 그럴 때 참고하세요.하다이전 입력 읽기CTRL+V쉘에서는 전혀 차이가 없습니다. 단지 라인 규칙에 대해 인용된 것뿐입니다. 의미 있는 작업을 수행하려면 쉘을 사용하여 개행 문자를 인용하는 것이 좋습니다.

그런데,CTRL+V다른 방법으로 효과적으로 적용할 수 있습니다. 예를 들어 "$(printf \\33)"이것은 글쓰기가 아닙니다.ESC쉘 스크립트에 문자 쓰기 - 이것은 가장 간단하지도 않습니다. 먼저 이 방법으로 이스케이프하면 입력 드라이버가 문자를 해석하지 않고도 키보드가 보내는 문자를 문자 그대로 입력할 수 있습니다.

나는 종종 셸에서 아무것도 수행하지 않고 명령줄에서 <tab>을 사용하는 것을 좋아합니다. 완성 쉘은 일반적으로 stty eol \t완성 시스템이 제대로 작동하는 것과 동일한 방식으로 <tab>을 구성하기 때문에CTRL+V낯선 환경에서도 저에게 효과적입니다.

관련 정보