답변:
파일 목록이 filelist 라는 파일 (정확히 한 줄에 하나의 파일 경로)에 저장되어 있고 압축 파일을 zipdir 에 저장하려는 경우이 bash 스크립트는 원하는 결과를 얻습니다.
#!/bin/bash
while IFS= read file; do
gzip -c "$file" > "zipdir/$(basename "$file").gz"
done < filelist
bash / dash에서 위의 것을 하나의 라이너로 변환 할 수도 있습니다.
while IFS= read file; do gzip -c "$file" > "zipdir/$(basename "$file").gz"; done < filelist
다른 쉘 (예 : tcsh 또는 zsh)
bash -c 'while IFS= read file; do gzip -c "$file" > "zipdir/$(basename "$file").gz"; done < filelist'
일을 할 것입니다.
bash가 없으면 대시로 대체 할 수 있습니다.
... < filelist
의 내용을 리디렉션 파일 목록 에를 ...
.
while IFS= read file; do ... done
filelist의 행을 통과하고 현재 처리 된 행의 내용을 변수 파일에 저장 하고 실행 ...
합니다.
IFS=
내부 파일 구분 기호를 수정합니다. 여러 개의 선행 및 후행 공백을 올바르게 처리하는 데 필요합니다.
gzip -c "$file" > "zipdir/$(basename "$file").gz"
현재 처리 된 파일을 압축하고 zipdir 디렉토리의 확장자 가 .gz 인 파일에 출력을 저장합니다 .
다음은 basename "$file"
파일의 경로에서 베어 파일 이름을 추출합니다.
bash -c
.
gzip
파일에서 경로를 읽는 것을 지원 하지 않는다고 생각 합니다. 해결 방법은 모든 대상 파일을 아카이브 (tar)에 넣거나 여러 번 실행하는 것입니다.
대상 디렉토리가 용량 또는 전송 속도와 관련하여 제한되지 않은 경우 가능한 해결책은 이 답변에 설명 된대로 대상 폴더에서 파일을 압축하기 전에 파일을 이동하는 것 입니다.
그렇지 않으면 한 번에 하나의 파일 이름을 읽고 폴더를 압축하고 생성 할 때 폴더를 만듭니다.
폴더 구조 생성
TARGET=~/tmp/out
while read line; do
dirname "$line" ;
done < list.txt | sort -u |
xargs -I% echo mkdir -p "$TARGET/%"
## out: ##
mkdir /home/jaroslav/tmp/out/code/bash
mkdir /home/jaroslav/tmp/out/recipes
mkdir /home/jaroslav/tmp/out/samba
mkdir /home/jaroslav/tmp/out/wikipedia
파일 복사
while read line; do
gzip -c "$SOURCE/$line" > "$TARGET/$line.gz"
done < list.txt
명령
u
nique를)