디렉터리의 복사본이 아닌 디렉터리의 모든 파일 삭제

디렉터리의 복사본이 아닌 디렉터리의 모든 파일 삭제

다음과 같은 폴더 구조가 있습니다

foo/images
foo/infos

infos에는 foo/images 폴더의 이미지를 설명하는 xml 파일 모음이 포함되어 있습니다. 명명 규칙은 다음과 같습니다. 이미지는 image1.png이고 설명자는 image1.xml입니다. 제가 해결하려는 문제는 다음과 같습니다.연관된 설명자가 없는 모든 이미지를 삭제합니다.

나는 이것을 위해 한동안 큰 성공을 거둔 emacs를 사용해 왔습니다. 그러나 이제는 emacs가 설치되지 않은 시스템에서 이 작업을 수행해야 하며 bash가 유일한 옵션입니다.

답변1

#!/bin/bash

infosdir="foo/infos"
imagesdir="foo/images"

# use a different IFS to allow spaces in filenames
IFS=$(echo -en "\n\b")

# for all images in the images-directory
for pngfullname in ${imagesdir}/*.png; do
 # get the name of the image without the path and without the file-extension
 basename="$(basename ${pngfullname} .png)"
 # if an appropriate xml-file in the infos-directory is missing
 if [ ! -f "${infosdir}/${basename}.xml" ] ; then
   # delete the image
   rm "${pngfullname}"
 fi
done

답변2

새 디렉터리를 만드는 것이 좋습니다.

mkdir images_clean

그런 다음 기존 정보가 포함된 이미지를 이 디렉터리로 이동합니다.

cd foo/infos
for f in *; do name="${f%.xml}"; mv ../foo/images/"$name".png ../foo/images_clean; done

나머지는 나중에 삭제하세요

rm -rf foo/images

관련 정보