이 명령줄을 이해해야 합니다.
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
때문일 가능성이 높습니다 .basename
xargs
동일한 내용의 더 짧고 빠른 버전은 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
.