이 명령줄(`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 basename일반 입력 대신 사용되는 유일한 이유는 유틸리티가 표준 입력에서 읽지 않고 읽기 basename때문일 가능성이 높습니다 .basenamexargs

동일한 내용의 더 짧고 빠른 버전은 bash다음과 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)

따옴표와 함께. (또는 as ${file%%.*}대신 접미사 제거 쉘 확장 사용)cut쿠살라난다가 보여준.)

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

답변4

이 행은 확장자 및 경로 없이 파일 이름을 변수에 저장합니다 $file.

상세히:

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

예를 들어 다음을 실행하면

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

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

관련 정보