나는 다음을 수행하기 위해 "우아한" 솔루션을 디자인하려고 합니다.
unzip applications/<abc>.zip -d applications/<abc>/
unzip applications/<def>.zip -d applications/<def>/
unzip applications/<ghi>.zip -d applications/<ghi>/
unzip applications/<jkl>.zip -d applications/<jkl>/
중괄호 확장은 적용되지 않습니다. 이는 내가 찾고 있는 것과 "반대"입니다(또는 뭔가 빠졌습니까?).
루프가 for
갈 길입니까? 나는 과거 컨트롤(
무엇과 함께 xargs
인수를 역참조하는 것 )을 사용하거나 활용하는 것에 대해 생각했지만 !:1
상황은 빠르게 단순해지기보다는 복잡해졌습니다.
나는 정규식 역참조에 편향되어 있다고 생각합니다. 쉘에 비슷한 것이 있습니까?
답변1
일부 변수 확장 규칙이 있는 for 루프가 원하는 대로 작동할 수 있습니다.
for file in applications/*.zip
do
unzip "$file" -d "${file%.zip}"
done
이 표현은 " ${file%.zip}
끝에서 with의 내용을 제거한다"는 의미입니다.$file
.zip
따라서 첫 번째 루프는 $file
읽을 수 applications/abc.zip
있으므로 ${file%.zip}
읽습니다 applications/abc
.
답변2
당신이 언급한 것 xargs
. xargs 명령은 Thompson이나 Mashey 쉘이 for
루프를 지원하지 않을 때 PWB/Unix에 나타났습니다. for
귀하의 경우에는 루프가 가장 적합하다고 생각합니다 . 그러나 가능하면 프로그램에서 파이프를 사용하는 것이 우아하므로 xargs를 사용하여 이를 수행하는 방법은 다음과 같습니다.
printf "%s\n" abc def ghi jkl | xargs -I {} unzip applications/{}.zip -d applications/{}/
답변3
한 가지 가능성은 변수입니다. 이전/별도 명령에 할당하면 됩니다.
a=abc
unzip applications/"$a".zip -d applications/"$a"/
a=def
!unzip
답변4
예, for
루프는 귀하의 작업에 훌륭한 솔루션입니다.
for i in abc def ghi jkl; do
unzip applications/"$i".zip -d applications/"$i"/
done
또는 스크립트 대신 명령줄에서 사용하려면 한 줄에 동일한 명령을 사용하세요.
for i in abc def ghi jkl; do unzip applications/"$i".zip -d applications/"$i"/; done
예제의 값에는 따옴표가 $i
필요하지 않지만 공백이나 기타 특수 문자가 포함된 값이 절대 없을 것이라고 확신하는 경우에는 따옴표를 사용하는 것이 좋습니다.