이름에 공백이있는 파일 삭제


10

이름에 공백이있는 모든 파일을 삭제하려고합니다. 다음 명령을 사용하고 있습니다. 그러나 그것은 나에게 오류를주고있다

사령부 : ls | egrep '. ' | xargs rm

여기서 ls | egrep '. '명령 만 사용 하면 파일 이름에 공백이있는 모든 파일 이름이 지정됩니다. 그러나 출력을 rm에 전달하려고하면 모든 공백 (선행 또는 후행)이 삭제됩니다. 그래서 내 명령이 제대로 실행되지 않습니다.

이름에 공백이 하나 이상있는 파일을 삭제하는 방법에 대한 조언이 있습니까?

답변:


29

rm명령 에서 표준 글 로빙을 사용할 수 있습니다 .

rm -- *\ *

이름에 공백이 포함 된 모든 파일이 삭제됩니다. 공백은 이스케이프 처리되어 쉘은이를 분리 자로 해석하지 않습니다. 추가 --하면 파일 이름이 대시로 시작하는 문제를 피할 수 있습니다 (에 의해 인수로 해석되지 않음 rm).

파일을 삭제하기 전에 각 파일을 확인하려면 -i옵션을 추가하십시오 .

rm -i -- *\ *

4
당신은 확실히 echo오타를 막기 위해 첫 번째로 이것을 실행하고 싶을 것 입니다. echo앞에 추가 하면 제거 할 모든 파일이 인쇄됩니다.
Riking

1
Anuj, 이것이 가장 찬란한 이유 find는 강력 하기는하지만 때로는 기관총으로 닭을 죽일 필요가 없기 때문 입니다. 유닉스 관리자는 일반적으로 find(예를 들어) "문자 A로 시작하는 모든 파일 제거"에 의존하지 않습니다 rm A*. 공백이 포함 된 파일을 제거하는 것과 마찬가지로 rm도 작업을 수행 할 수 있습니다. 즉, 공간이 보이지 않고 셸에서 특별히 처리되기 때문에 속지 마십시오. Stephen Kitt가했던 것처럼 그냥 도망 치면 다른 캐릭터처럼 생각할 수 있습니다.
Mike S

14

ls출력 구문 분석을 피할 것입니다

왜 안되죠?

find . -type f -name '* *' -delete

rm:-)에는 문제가 없습니다 .

이것은 재귀 적이지만 주석에서 언급 한 것처럼 현재 디렉토리와 중첩 디렉토리에 공간이있는 모든 파일을 삭제합니다.


4
(1) -name '* *'정규식 대신 사용할 수 있습니다 . (2) -print0 | xargs -0 rm -i@StephenKitt의 우려를 해결 하는 데 사용할 수 있습니다 .
Kevin

1
필요 없습니다 xargs. 그냥 사용하십시오-exec rm -i '{}' +
R .. GitHub 중지 도움 얼음

1
@Mhmd 8 비트 게임 콘솔보다 더 많은 함정이 있습니다. mywiki.wooledge.org/ParsingLs
Daenyth

1
하위 디렉토리를 피하려면을 사용하십시오 find . -maxdepth 1 -name '* *' -delete.
Mikkel

1
@BenjaminW. 고정?
solsTiCe

6

이 가정 이름 "이상한 파일"을보십시오

해결책 하나

rm strange\ file

해결책 2

rm "strange file"

해결책 3

ls -i "strange file"

당신은 다음 inode를 참조하십시오

find . -inum "numberoofinode" -exec rm {} \;

매우 이상한 파일 이름의 경우

!-filename or --filename

사용하다

rm ./'!-filename'

4

에서 man xargs

xargs는 표준 입력에서 항목 ( 공백 (작은 따옴표 또는 백 슬래시 또는 백 슬래시로 보호 할 수 있음) 또는 줄 바꾸기로 구분됨)을 읽으며 초기 인수와 함께 명령 (기본값은 / bin / echo)을 한 번 이상 실행합니다. 표준 입력에서 읽은 항목 별. 표준 입력의 빈 줄은 무시됩니다.

xargs 구분자를 개행 문자로 변경하여 초기 명령을 대부분 수정할 수 있습니다.

ls | egrep '. ' | xargs -d '\n' rm (하지 마십시오 ... 계속 읽으십시오)

그러나 파일 이름에 줄 바꿈이 포함되어 있으면 어떻게됩니까?

touch "filename with blanks and newline"

유닉스 파일 이름은 공백과 개행 문자를 포함 할 수 있기 때문에이 기본 동작은 종종 문제가됩니다. 공백 및 / 또는 줄 바꿈이 포함 된 파일 이름은 xargs에서 잘못 처리됩니다. 이러한 상황에서는 이러한 문제를 방지 하는 -0 옵션사용하는 것이 좋습니다 .

ls 는 실제로 사람이 직접 소비하는 도구입니다 . 대신 find파일 이름을 null 문자 ( -print0)로 구분할 수 있는 명령 을 사용해야합니다 . 또한 grep에게 널 문자를 사용하여 입력 ( -z)과 출력 ( -Z) 을 구분하도록 지시해야합니다 . 마지막으로 xargs에게 널 문자 ( -0)를 사용하도록 지시합니다.

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm



-1

그렇게하려면 -Zgrep -0옵션과 xargs 옵션 이 필요합니다 . 그러나 나는 그렇게하지 않을 것입니다 ( ls작업에 적합한 도구는 아니며 컴퓨터가 출력을 읽는 데 많은 문제가 있습니다).

더 나은 방법은 다른 답변을 참조하십시오.


또한

ls | …동등 ls -d *하고echo * | …

모두 문제가 있습니다. 따라서 ls이와 같이 사용하지 말고 다른 답변의 솔루션을 사용하십시오.


또한 ls *파이프가 파일 이름을 줄 바꿈으로 출력 할 때. echo(적어도 일부 echo구현) 백 슬래시 시퀀스를 확장합니다. grep -Z를 사용할 때 파일 이름을 NUL로 구분하여 작성하는 -l데 도움이되지 않습니다. 당신이 의미한다면 -z, 대부분의 ls구현에는 NUL로 구분 된 파일 이름을 출력하는 옵션이 없기 때문에 도움이되지 않습니다 . printf '%s\0' * | grep -z ' ' | xargs -r0 rm -f그래도 같은 것을 할 수 있습니다.
Stéphane Chazelas

1
@ Kusalananda 나는 그것을 고쳤다 고 생각한다.
ctrl-alt-delor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.