아카이브로 이동할 때 파일을 압축하는 데 필요한 도움말

아카이브로 이동할 때 파일을 압축하는 데 필요한 도움말

() 디렉토리에 목록 파일과 소스 파일이 있습니다 /int/source/HR100. 따라서 소스 디렉터리의 내용은 다음과 같습니다.

Customer_Account_20211202.csv
Customer_Account.lst

목록 파일( Customer_Account.lst)에는 소스 파일의 이름이 포함되어 있습니다. 즉, Customer_Account_20211202.csv이제 소스 파일을 압축하여 대상 디렉터리( )로 이동하려고 합니다 /int/source/HR100/Archive. 아래와 같이 한 줄의 Unix 명령을 사용하여 이동할 수 있지만 압축하는 방법을 모르겠습니다.그리고파일을 이동합니다. 나는 Gzip( .gz) 형식을 선호합니다.

내가 사용하는 코드:

xargs -a Customer_Account.lst mv -t /int/source/HR100/Archive

위의 코드 줄은 압축 없이 코드를 이동합니다. 목록에서 파일을 읽고 압축한 다음 이동하는 한 줄의 코드가 필요합니다.

답변1

다음과 같이 시도해 볼 수 있습니다.

a=$(cat Customer_Account.lst).gz; xargs -a Customer_Account.lst gzip -c >/int/source/HR100/Archive/$a

답변2

데이터 파일("소스 파일"이라고 함)이 하나만 있는 경우에는 xargs로미오 니노프의 답변, 단순한 데이터 파일로 단순화되고 실제로 move( mv)를 수행하도록 수정된 는 다음과 같습니다.

a=$(< Customer_Account.lst)  &&  gzip "$a"  &&  mv "$a.gz" /int/source/HR100/Archive

a=$(< Customer_Account.lst)bash에서 그것을 수행하는 방법은 어디에 있습니까 a=$(cat Customer_Account.lst)? 따라서 파일 이름을 읽고 Customer_Account.lst, 파일을 압축하고, 압축된 파일을 Archive 디렉터리로 이동합니다. 우리는 이를 사용하여 &&이전 단계가 성공한 경우에만 이후 단계가 실행되도록 하고, 항상 이 작업을 수행해야 하므로 변수를 참조합니다.

Customer_Account.lst그러나 사용하려는 "목록 파일"을 호출합니다 xargs. 이러한 사실은 언젠가는 에 있을 수 있음을 시사합니다 Customer_Account.lst. 따라서 명령을 다음과 같이 조정하는 것이 좋습니다.

xargs -a Customer_Account.lst sh -c 'for f; do gzip "$f"  &&  mv "$f.gz" /int/source/HR100/Archive; done' sh

명령을 xargs실행 하는 데 사용되는 경우 mv이 명령은 (셸)을 xargs실행 하는 데 사용됩니다. sh쉘은 매개변수를 반복하고 각 매개변수를 압축 및 이동하는 한 줄 스크립트로 호출됩니다.

파일이 6~8개라면 괜찮습니다. 그러나 각 파일에 대해 한 번씩 호출되고 각 파일에 대해 한 번씩 호출됩니다 gzip. mv이는 낭비이며 수백 개의 파일이 있는 경우 명령을 실행하는 데 오랜 시간이 걸릴 수 있습니다. 이 경우 다음을 고려하십시오.

xargs -a Customer_Account.lst bash -c 'gzip "$@"  &&  mv "${@/%/.gz}" /int/source/HR100/Archive' sh

이는 또한 목록 파일의 파일 이름 목록을 사용하여 셸(구체적으로 bash)을 실행하지만 명시적인 루프를 수행하지는 않습니다. 대신 "$@"list()를 에 전달한 gzip다음 목록의 수정된 버전을 에  전달합니다 mv. 에 의해 수정되었습니다 "${@/%/.gz}".  와 /%/.gz마찬가지로 끝에 추가됩니다 . 인수 목록의 모든 단어가 대체되도록 합니다 . (이 기능은 bash에 있지만 다른 모든 POSIX 호환 셸에는 없습니다.)s/$/.gz/sed.gz"${@…}"

관련 정보