먼저 아카이브에서 파일을 하나씩 추출한 다음 파일 이름을 인수로 사용하여 Java 프로그램을 호출하여 일부 작업을 수행하는 bash 스크립트를 작성하려고 합니다. 다음 스크립트를 사용해 보았지만 작동하지 않습니다.
나는 다음과 같은 문제에 직면하고 있습니다 :
압축된 파일의 이름이 compressed.7z
.7z 아카이브에 두 개의 파일이 있다고 가정합니다: sample_1.json
및 sample_2.json
(무엇이든 가능). 명령 은 7za
항상 compressed.7z
내가 원하지 않는 파일 이름으로 출력됩니다. sample_1.json
출력 폴더에서 추출된 콘텐츠를 가져와 java 명령에 이름을 할당한 후 sample_2.json
다음 반복을 진행하고 싶습니다 .
이 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요? 미리 감사드립니다.
#!/bin/bash
for file in *.7z
do
7za x -ooutput "${file}" | java -jar Remove_BoilerPlate_JSON_Updated.jar "${file}";
done
답변1
이것은 가장 효율적인 접근 방식이 아닐 수도 있지만 귀하가 원하는 것입니다.
먼저 아카이브에 있는 파일 목록이 필요합니다. 를 통해 받으실 수 있습니다 7za l
. 하나 있다문서화되지 않은 -ba
출력 스위치 활성화처리하기가 더 쉽다. 우리는 할 수 있다마지막 열 가져오기이 출력의 내용에는 확장자가 .인 아카이브 파일의 이름이 포함되어 있습니다 awk '{print $NF}'
. 명령의 출력을 스크립트의 값으로 얻으려면 다음을 사용할 수 있습니다.명령 대체그리고 $()
문법.
파일을 추출하기만 하고 아카이브에 디렉터리 구조가 필요하지 않기 때문에 파일 추출 명령 에서 e
명령을 대신 사용할 수 있습니다 . 아카이브 이름을 매개변수로 제공하는 것을 잊지 마세요.x
7za
위의 내용을 바탕으로 스크립트는 다음과 같습니다.
#!/bin/bash
for file in $(7za l -ba compressed.7z | awk '{print $NF}')
do
7za x -ooutput compressed.7z "$file"
java -jar Remove_BoilerPlate_JSON_Updated.jar output/"$file"
done
답변2
libarchive bsdtar
+ GNU를 사용하면 tar
다음을 수행할 수 있습니다.
bsdtar cf - @compressed.7z |
tar -x --to-program='
cat > file.json &&
java -jar Remove_BoilerPlate_JSON_Updated.jar file.json
'
파일을 GNU로 동적으로 bsdtar
다시 포맷하고(GNU는 7z 형식을 지원하지 않기 때문에) GNU의 기능을 사용하여 각 멤버를 디스크에 저장하는 대신 프로그램에 파이프합니다.7z
ustar
tar
tar
tar
--to-program
여기에서는 항상 입력을 해당 파일에 저장 file.json
하고 java
해당 파일을 호출합니다. java
표준 입력에서 직접 입력을 얻을 수 있다면 그렇게 --to-program='java -jar Remove_BoilerPlate_JSON_Updated.jar'
할 수 있습니다. 아니면 --to-program='java -jar Remove_BoilerPlate_JSON_Updated.jar /dev/stdin'
…
java
아카이브에 저장된 파일 이름을 받는 것이 중요한 경우 $TAR_FILENAME
환경 변수에서 가져올 수 있습니다.--to-program='f=${TAR_FILENAME##*/}; cat > "$f" && java -jar Remove_BoilerPlate_JSON_Updated.jar "$f" && rm -f -- "$f"'