예를 들어:
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 루프는 이미 사용하고 있지만 이 문제에 적용할 생각은 하지 않은 일반적인 패턴이기 때문에 이 솔루션이 주목할 만하다고 생각합니다. 저도 처음에 생각할 땐 이런 생각을 못했어요.