명령 옵션에서 파일 대신 파이프에서 읽은 데이터 사용


18

사용자 정의에 따라이 명령은 파일에서 입력을 가져옵니다.

$ command -r FILENAME

FILENAME사용하여 생성 된 파일 이름 목록을 포함하는 파일 이라고 가정하십시오 ls > FILENAME.

대신 ls직접 결과를 명령에 어떻게 공급할 수 있습니까? 내 머리 속에 이런 것이 가능해야합니다.

$ ls | command -r

그러나 그렇지 않습니다.의 결과가 ls인수로 얽매이지 않습니다. 산출:

Usage: command -r FILENAME
error: -r option requires an argument

원하는 효과를 어떻게 얻을 수 있습니까?


답변:


31

이것은 명령에 따라 다릅니다. 파일에서 읽는 일부 명령은 파일이 크기가 미리 알려져 있고 어느 위치에서나 되 감아도되는 일반 파일 인 것으로 예상합니다. 파일의 내용이 파일 이름의 목록 인 경우에는 가능하지 않습니다. 명령은 파이프가 있는 내용 일 것입니다. 파이프 는 처음부터 끝까지 순차적으로 읽습니다. 파일 이름이 필요한 명령에 파이프를 통해 데이터를 공급하는 방법에는 여러 가지가 있습니다.

  • 많은 명령 -이 특수 이름으로 취급 되므로 파일을 열지 않고 표준 입력 에서 읽습니다 . 이것은 의무가 아니라 관습입니다.

    ls | command -r -
  • 많은 유닉스 변종은 특수 파일을 제공합니다. /dev 은 표준 설명자를 지정하는 . /dev/stdin존재하는 경우 , 그것을 열고 읽는 것은 표준 입력에서 읽는 것과 같습니다. /dev/fd/0존재하는 경우에도 마찬가지 입니다.

    ls | command -r /dev/stdin
    ls | command -r /dev/fd/0
  • 쉘이 ksh, bash 또는 zsh 인 경우 일부 파일 디스크립터 할당 비즈니스를 쉘이 처리 할 수 ​​있습니다. 이 방법의 주요 장점은 표준 입력과 연결되어 있지 않기 때문에 표준 입력을 다른 용도로 사용할 수 있으며 두 번 이상 사용할 수 있다는 것입니다.

    command -r <(ls)
  • 명령에서 이름에 특정 형식 (일반적으로 특정 확장명)이있을 것으로 예상되면 기호 링크를 사용하여 속일 수 있습니다.

    ln -s /dev/fd/0 list.foo
    ls | command -r list.foo

    또는 명명 된 파이프를 사용할 수 있습니다.

    mkfifo list.foo
    ls >list.foo &
    command -r list.foo

인쇄 할 수없는 문자가 포함 된 파일 이름을 엉망으로 만드는lsls 경향이 있기 때문에 파일 목록생성하는 것은 문제가 됩니다. printf '%s\n' *보다 안정적입니다. 모든 바이트를 문자 그대로 파일 이름으로 인쇄합니다. 줄 바꿈이 포함 된 파일 이름은 여전히 ​​문제를 일으킬 수 있지만 명령에서 줄 바꿈으로 구분 된 파일 이름 목록이 필요한 경우 피할 수 없습니다.


모든 가능성을 열거하면 +1입니다. IMO 프로세스 대체는이 상황에 대한 정답입니다.
glenn jackman

7

그것은해야한다:

ls | xargs -n 1 command -r

편집 : 공백이있는 이름의 경우 :

ls | xargs -d '\n' -n 1 command -r

command명령 행에 한 번에 필요한 모든 파일 이름이 있다고 생각 되면 문제가 될 수 있습니다 . 일부 버전의 xargs는 command한 번에 몇 개의 파일 이름 (10, 나에게 보입니다)을 제공합니다. GNU xargs가 모든 것을 한 번에 제공하는 것처럼 보입니다.
브루스 에디 거

2

실제로, 줄 알 수있는 파일 이름을 포함하여 모든 파일 이름을 처리 할 수있는 신뢰할 수있는 유일한 솔루션은 다음과 같습니다.

find . -maxdepth 1 -print0 | xargs -n 1 -0 command -r

이 경우 파일 이름에 허용되지 않는 유일한 문자는 null 문자이며 파일 이름에는 사용할 수 없습니다.


1

많은 명령 -이 "표준 입력 사용"을 의미하는 "파일 이름"으로 허용 되지만이 규칙은 보편적 인 것과는 거리가 멀습니다. 매뉴얼 페이지를 읽으십시오.


1

이것은 당신의 목적을 위해 작동해야합니다 : ls | command -r /dev/stdin

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.