이 명령줄(`echo $1 | xargs -n 1 basename | cut -d '.' -f1`)은 무엇을 합니까? [폐쇄]

이 명령줄(`echo $1 | xargs -n 1 basename | cut -d '.' -f1`)은 무엇을 합니까? [폐쇄]

이 명령줄을 이해해야 합니다.

file=`echo $1 | xargs -n 1 basename | cut -d '.' -f1`

답변1

파일 이름의 일부(경로 포함)를 변수에 할당합니다 file. 특히, .파일 자체의 파일 이름에서 첫 번째 문자 앞의 비트입니다. 즉, 이와 같은 것을 취하고 비트를 /some/path/hello.world구문 분석합니다 hello.

한 가지 비결은 명령줄에서 파이프라인의 각 부분을 실행하는 것입니다.

$ thing="/some/path/hello.world"

$ echo "$thing"
/some/path/hello.world

$ echo "$thing" | xargs -n 1 basename
hello.world

$ echo "$thing" | xargs -n 1 basename | cut -d '.' -f 1
hello

백틱은 파이프의 출력을 반환하고 에 할당하는 데 사용됩니다 file. 이는 $1명령줄(해당 스크립트 또는 해당 함수가 속한 쉘 함수에 대한)의 첫 번째 인수입니다.

xargs -n 1 basenameplain 대신 사용하는 유일한 이유는 유틸리티가 표준 입력에서 읽지 않고 표준 입력에서 읽기 basename때문일 수 있습니다 .basenamexargs

bashor 에서 동일한 것의 더 짧고 빠른 버전 ksh93입니다 .

file=${1##*/}
file=${file%%.*}

답변2

$1이 줄은 제공된 경로(이 줄이 나타나는 스크립트의 첫 번째 매개변수)에서 확장자가 없는 파일 이름을 추출합니다. 결과는 변수에 저장됩니다 file.

데모:

$ echo /etc/dhcpcd.conf ../foo/bar/filename.tar.gz | xargs -n 1 basename | cut -d '.' -f1
dhcpcd
filename

답변3

echo여기서는 and의 조합이 xargs꽤 이상합니다.

basename명령줄에서 경로 이름을 가져오고 최종 구성 요소(즉, 일반적으로 마지막 슬래시 다음 부분)를 인쇄합니다. xargs입력(파이프라인)에서 읽은 단어를 basename여기에 명령줄에 넣기만 하면 됩니다. 그렇다면 그냥 사용해 보는 것이 어떨까요 basename $1?

그러나 차이점이 있습니다.

echo $1 | xargs -n 1 basename인수에 $1공백이 포함된 경우 xargs공백으로 나누고 basename각 단어를 별도로 호출합니다. 최종 결과는 파일 이름의 일부가 선택되는 것입니다.모두다음과 같은 단어는아르미니안은 선언한다.

다른 옵션인 은 한 번만 basename $1호출됩니다 basename(단어 분리로 인해 좋은 방법으로 실패합니다).

명령이 하나의 파일 이름만 처리하는 경우 다음과 같이 작성하는 것이 좋습니다.

file=$(basename "$1" | cut -d '.' -f 1)

따옴표 포함. (또는 다음 ${file%%.*}대신 접미사가 제거된 쉘 확장을 사용하십시오.cut.)

반면에 여러 파일 이름을 처리해야 하는 경우 $1배열을 사용하거나 위치 인수(단순 인수가 아닌 모든 인수)에 전달하는 것이 더 깔끔할 수 있습니다.

답변4

이 줄은 파일 이름(확장자 및 경로 제외)을 변수에 저장합니다 $file.

상세히:

echo $1스크립트에 전달된 첫 번째 명령줄 인수를 인쇄하고 에코된 문자열을 파일 이름에서 경로를 제거하는 xargs -n 1 basenamecommand 에 대한 인수로 전달합니다 . 확장 프로그램을 제거하세요.basenamecut -d '.' -f1

예를 들어 그렇게 한다면

echo directory/test.sh | xargs -n 1 basename | cut -d '.' -f1

결과( 에 저장 $file)는 입니다 test.

관련 정보