이미지가 15개 있는 항목도 있고 ID와 연결된 이미지가 15개 미만인 항목도 있습니다. 이미지가 15개 있는 이미지만 보관하려면 어떻게 해야 하나요?
$ ls -l 72065050* | wc -l
15
$ ls -l 71088714* | wc -l
3
그리고
$ ls 71088714*
71088714_0.jpg 71088714_1.jpg 71088714_2.jpg
$ ls 72065050*
72065050_0.jpg 72065050_11.jpg 72065050_13.jpg 72065050_1.jpg 72065050_3.jpg 72065050_5.jpg 72065050_7.jpg 72065050_9.jpg
72065050_10.jpg 72065050_12.jpg 72065050_14.jpg 72065050_2.jpg 72065050_4.jpg 72065050_6.jpg 72065050_8.jpg
또한 이러한 ID 중 몇 개의 ID에 15개의 이미지가 연결되어 있는지 어떻게 알 수 있나요?
답변1
테스트되지 않았지만 다음과 같이 할 수 있습니다.
printf "%s\n" *.jpg | cut -d_ -f1 | sort -u | while IFS= read -r prefix; do
files=( "$prefix"*.jpg )
if [[ "${#files[@]}" -ne 15 ]]; then
echo rm "$prefix"*
fi
done
고유한 접두사 목록을 찾고 각 접두사에 대해 파일 목록을 배열에 넣습니다. 배열의 크기가 15가 아니면 제거합니다.
답변2
#!/bin/bash
find . -maxdepth 1 -iname '*.jpg' |\
while IFS='' read -r bla; do
if ! ls "${bla:0:7}"_14.jpg >/dev/null 2>&1; then
echo rm "${bla:0:7}"*
fi
done
답변3
또 다른 가능한 대답은 다음과 같습니다.
$ declare -A pref ; for f in *_[0-9]*.jpg ; do p=${f%_*} ; (( pref[$p]++ )); done ; for p in "${!pref[@]}" ; do (( ${pref[$p]} < 15 )) && rm "$p"_* ; done
답변4
이 작업에는 셸이 아닌 언어를 사용할 수도 있습니다.
ruby -e '
files = Dir.glob("*")
groups = files.group_by {|f| f.sub(/_.*/, "")}
groups.each_value {|flist| File.delete(*flist) if flist.length < 15}
'
또는
perl -e '
foreach $f (glob "*") {
($prefix = $f) =~ s/_.*//;
push @{$groups{$prefix}}, $f;
}
foreach $flist (values %groups) {
unlink @$flist if (scalar @$flist < 15);
}
'