개별 파일을 찾아 압축하고 원본 파일을 삭제합니다.

개별 파일을 찾아 압축하고 원본 파일을 삭제합니다.

.txt많은 개별 파일을 포함하는 디렉토리를 만들어 보겠습니다 . 내 목적은 디렉토리에서 개별 파일을 찾아 동일한 이름(.txt 제외)으로 개별적으로 압축하고 원본 파일을 삭제하는 것입니다.

gzip아래와 같이 사용이 매우 간단합니다 .

find .* -type f | xargs gzip 

하지만 파일을 압축해야 해요.

참고: sudo 권한이 없습니다.

답변1

고려하다:

$ ls -1
a.txt
b.txt
c.txt
d.jpg

다음 명령은 각 .txt파일을 압축하고 원본 파일을 삭제합니다.

find . -maxdepth 1 -type f -name '*.txt' -exec zip -Tm {}.zip {} \;
 

결과:

$ ls -1
a.txt.zip
b.txt.zip
c.txt.zip
d.jpg

노트:입력 파일을 삭제하기 전에 아카이브의 무결성을 테스트하기 위해 이 옵션을 사용합니다 -T. 옵션 zip의 매뉴얼 페이지에서는 다음을 제안합니다 -m.

-m, --move
지정된 파일을 zip 아카이브로 이동합니다. 실제로 이는 지정된 zip 아카이브를 생성한 후 대상 디렉터리/파일을 삭제합니다. 파일을 삭제한 후 디렉터리가 비어 있으면 해당 디렉터리도 삭제됩니다. zip이 오류 없이 아카이브를 생성할 때까지는 삭제가 발생하지 않습니다. 이는 디스크 공간 절약에 유용하지만 잠재적으로 위험할 수 있으므로 -T모든 입력 파일을 삭제하기 전에 테스트 아카이브와 함께 사용하는 것이 좋습니다 .

.txt부분은 여전히 ​​파일 이름에 존재합니다. 이것은 gzip행동하는 방식이기도 합니다.

이 부분을 제거하려면 .txt:

.txt해당 부분을 파일 이름에 유지 하지 않으려면 다음 명령을 사용하여 이를 달성할 수 있습니다.

find . -maxdepth 1 -name '*.txt' -type f -exec bash -c \
  'zip -Tm "${1%.*}".zip "$1"' inline-bash {} \;

결과:

$ ls -1
a.zip
b.zip
c.zip
d.jpg

노트:find위 명령으로 호출된 조건자의 순서는 이름이 패턴과 일치하지 않는 파일에 적용되는 것을 방지합니다 -type f(비용이 많이 드는 시스템 호출이 포함될 수 있음). (lstat()*.txt인용하다)

노트:inline-bash이를 인라인 스크립트의 첫 번째 인수로 제공합니다 . 여기에는 두 가지 이점이 있습니다.

  1. $0인라인 스크립트에서는 로 설정됩니다 inline-bash(이를 기억하세요)."$0은 쉘 또는 쉘 스크립트의 이름으로 확장됩니다." —배쉬 매뉴얼-c.) , using 또는 이와 유사한 기능을 사용하여 실행되는 인라인 스크립트의 경우 inline-bash이 목적에 논리적이며 다른 인기 있는 옵션을 선택한 경우보다 더 의미 있는 오류 메시지를 생성합니다 _.
  2. 스크립트의 위치 매개변수는 평소와 같이 1부터 시작합니다.

인라인 스크립트에 0번째 인수와 이를 호출하는 방법을 제공합니다.에 관한 기사찾기 사용(mywiki.wooledge.org)그리고답변: Stéphane Chazelas이 문제에 대한find -exec sh -c사용해도 안전한 가요 ?.

답변2

남성의 경우:

  -m
   --move
          Move  the  specified  files  into the zip archive; actually, this deletes the target directories/files after making the specified zip archive. If a directory
          becomes empty after removal of the files, the directory is also removed. No deletions are done until zip has created the archive without error.  This is use-
          ful  for  conserving  disk  space, but is potentially dangerous so it is recommended to use it in combination with -T to test the archive before removing all
          input files.

현재 디렉터리의 Ann 파일을 압축합니다.

zip -m test.zip *.txt

노력하다이것,

for i in *.txt; 
do
  zip -m "${i%.*}.zip" "${i%.*}".*; 
done

위의 코드는 for 루프에서 확장자가 .txt인 모든 파일을 가져오고 접두사 이름을 사용하여 각 파일을 압축합니다.

관련 정보