파일에 명령을 실행할 때 전체 이름을 입력하지 않고 파일을 참조할 수 있는 방법이 있습니까? [복사]

파일에 명령을 실행할 때 전체 이름을 입력하지 않고 파일을 참조할 수 있는 방법이 있습니까? [복사]

예를 들어:

tar xvf test.tar.gz ;  rm test.tar.gz

두 번째 실행에서 파일 이름을 참조하는 더 빠른 방법이 있습니까?

나는 다음과 같은 것을 생각하고 있었습니다(잘못되었습니다).

tar xvf test.tar.gz ; rm $1

가능합니까?

나는 와일드카드를 완전히 이해합니다.

답변1

먼저 파일 이름을 변수에 할당할 수 있습니다.

f=test.tar.gz; tar xvf "$f"; rm "$f"

또는 사용$_특수 매개변수, 여기에는 이전 명령의 마지막 단어가 포함되어 있으며 일반적으로(물론 항상 그런 것은 아님) 사용했던 파일 이름입니다.

tar xvf test.tar.gz; rm "$_"

파일 이름이 항상 명령의 마지막 인수인 한(예: echo foo; echo $_; echo $_print three times foo) 여러 명령에서도 작동합니다.

그런데, 세미콜론 대신 연산자를 사용하여 tar ... && rm ...사용 하는 것을 고려할 수 있습니다 . &&이렇게 하면 rm첫 번째 명령이 실패하면 실행되지 않습니다.

답변2

!$두 번째 명령을 새 줄로 이동하면 작동합니다.

tar xvf test.tar.gz
rm !$

답변3

bash 버전 4 이상 에서는 기록 확장을 사용하여 현재 명령의 n번째 위치 인수를 참조할 수 있습니다. 예를 들어, tar xvf test.tar.gz이는 명령에 대한 두 번째 위치 인수이므로 명령을 다음과 같이 단순화할 수 있습니다.

tar xvf test.tar.gz && rm !#:2

또 다른 이식성 있는 방법(으로 테스트됨 )은 변수를 /bin/dash사용하여 참조하는 것입니다 .$_마지막위치 매개변수:

tar xvf test.tar.gz && rm "$_"

당신은 또한 볼 수 있습니다 동일한 매개변수로 여러 명령을 실행하는 방법은 무엇입니까?

답변4

루프를 사용하여 여러 파일을 처리한 적이 있다면 이미 단 하나의 파일에서도 작동하는 접근 방식을 사용한 것입니다.

for i in a.tgz b.tgz c.tgz; do tar xvf $i; rm $i; done

파일의 경우:

for i in a.tgz; do tar xvf $i; rm $i; done

이 for 루프는 이미 사용하고 있지만 이 문제에 적용할 생각은 하지 않은 일반적인 패턴이기 때문에 이 솔루션이 주목할 만하다고 생각합니다. 저도 처음에 생각할 땐 이런 생각을 못했어요.

관련 정보