![파일에 명령을 실행할 때 전체 이름을 입력하지 않고 파일을 참조할 수 있는 방법이 있습니까? [복사]](https://linux55.com/image/144706/%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%A0%20%EB%95%8C%20%EC%A0%84%EC%B2%B4%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%9E%85%EB%A0%A5%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%B8%EC%A1%B0%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
예를 들어:
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 루프는 이미 사용하고 있지만 이 문제에 적용할 생각은 하지 않은 일반적인 패턴이기 때문에 이 솔루션이 주목할 만하다고 생각합니다. 저도 처음에 생각할 땐 이런 생각을 못했어요.