이름은 같지만 확장자가 다른 파일을 압축하는 방법은 무엇입니까?

이름은 같지만 확장자가 다른 파일을 압축하는 방법은 무엇입니까?

다음과 같은 파일이 포함된 큰 디렉터리가 있습니다.

file1.txt
file1.meta
file1.csv
file2.txt
file2.meta
file2.csv
file2.abc

다음과 같은 zip 파일을 만들고 싶습니다.

file1.zip
file2.zip

나는 열심히 노력했다

ls -1 ~/TEMP | sed 's/\.[a-z]*//g' | uniq | awk '{print $NF}' | xargs -i zip {}.zip ~/TEMP/{}.*

하지만 이는 파일에 자금을 조달할 수 없다는 오류 메시지만 표시합니다. 문제는 와일드카드 *에 있는 것 같습니다.

zip error: Nothing to do! (file1.zip)
    zip warning: name not matched: /home/user/TEMP/file.*

답변1

분사하다제프의 ​​생각, 그러나 목록을 사용하지 않고:

for fname in *.*; do
    prefix=${fname%.*}
    [ ! -f "$fname" ] || [ -f "$prefix.zip" ] && continue
    zip "$prefix" "$prefix".*
done

이 루프는 현재 디렉터리에서 하나 이상의 점 문자를 포함하는 모든 이름을 반복합니다.

루프의 본문은 현재 파일 이름의 마지막 점 뒤의 비트를 제거하여 파일 이름 접두사를 추출합니다( from %%대신 in 사용).%첫 번째가리키다). 그런 다음 이름이 실제로 일반 파일 이름(또는 파일에 대한 심볼릭 링크)인지 여부와 해당 파일에 해당하는 Zip 아카이브가 이미 존재하는지 여부를 테스트합니다.

파일이 일반 파일(또는 심볼릭 링크)이고 아카이브가 존재하지 않는 경우 zip이 파일을 호출하여 아카이브를 생성합니다.

답변2

한 가지 방법은 bash에서(표시한 이후):

  1. 파일 이름 접두사 목록을 연관 배열로 수집합니다.

    declare -A prefixes
    for f in *; do prefixes[${f%%.*}]=1; done
    
  2. 접두사를 반복하고 zip 파일을 만듭니다.

    for p in "${!prefixes[@]}"; do zip "$p" "$p".*; done
    

관련 정보