다음과 같은 파일이 포함된 큰 디렉터리가 있습니다.
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에서(표시한 이후):
파일 이름 접두사 목록을 연관 배열로 수집합니다.
declare -A prefixes for f in *; do prefixes[${f%%.*}]=1; done
접두사를 반복하고 zip 파일을 만듭니다.
for p in "${!prefixes[@]}"; do zip "$p" "$p".*; done