Bash - "사용자 입력에서 일치하지 않는 배열만 제거"하는 함수를 만드는 방법

Bash - "사용자 입력에서 일치하지 않는 배열만 제거"하는 함수를 만드는 방법

다음과 같은 폴더에 1개의 파일이 있다고 가정해 보겠습니다.B.py

이 스크립트를 사용하여 폴더에 3개의 파일을 만들었습니다. 이러한 파일은 A.py B.py C.py.

read -r -p "Enter the filenames: " -a arr
for filenames in "${arr[@]}"; do
   if [[ -e "${filenames}" ]]; then
        echo "${filenames} file exists (no override)"
   else
        cp -n ~/Documents/library/normal.py "${filenames}" && echo "${filenames} file created"
   fi
done

여기서 A.py및 는 템플릿 C.py으로 생성되지만 변경되지 않은 상태로 유지됩니다.normal.pyB.py

지금 나는삭제 기능을 원함 A.py그리고 C.py(새로 생성됨).
덮어쓰지 않은 내용은 삭제되지 않습니다.

이것을 배열에서 어떻게 필터링할 수 있나요?

추신: 저는 아직 초보자입니다. 내 스크립트에서는 이 기능을 구현할 수 없습니다.
스크립트는 다음과 같이 제거해야합니다rm -i {A,C}.py

여기서 이 스레드를 봤어요
Bash - 배열에 없는 모든 파일을 찾는 방법

노트:사용자 입력은 3개가 아니라 정의되지 않았습니다.

답변1

.py현재 디렉토리의 모든 파일을 삭제하려는 경우정확한 사본, ~/Documents/library/normal.py그러면 다음과 같이 할 수 있습니다:

for f in ./*.py; do
  if cmp ~/Documents/library/normal.py "$f"; then
    rm "$f"
  fi
done

cmp이는 각 파일을 $fNormal.py와 비교하는 데 사용됩니다 . "$f"는 0(true)이 반환되는 경우에만 cmp제거됩니다 .

man cmp자세히보다.

~/Documents/library 디렉터리에서 실행하지 않도록 주의하세요. 이를 방지하는 버전은 다음과 같습니다.


src_file=~/Documents/library/normal.py
src_dir=$(dirname "$src_file")

if [ "$(realpath -e ./)" = "$(realpath -e "$src_dir")" ] ; then
  echo "Warning: This script is NOT safe to run in the same directory as $src_file" >&2
  exit 1
fi

for f in ./*.py; do
  if cmp "$src_file" "$f"; then
    rm "$f"
  fi
done

답변2

다음으로 전환할 수 있는 옵션이 제공되는 경우 zsh:

arr=()
# use vared instead of read for the user to be able to enter
# arbitrary file names including some with whitespace of newlines
# by using \ (and also allows some user friendly editing).
vared -p 'Enter the filenames: ' arr

files=(*(ND)) # files including hidden ones in the current directory

for file ${arr:|files}; do # loop over elements of arr *bar* those of files
  cp -n -- $template $file
done

그런 다음 에 없는 파일을 삭제하려면 $var다음을 수행하십시오.

rm -f -- ${files:|arr}

glob 한정자의 일부로 파일이 배열의 구성원인지 여부를 확인할 수도 있습니다.

rm -f -- *.py(e['(( ! $arr[(Ie)$REPLY] ))'])

예를 들어, 이름으로 정확히 찾을 수 없는 배열 요소는 .py숨김되지 않은 파일로 제거됩니다 .e$arr

$arr[(I)pattern]패턴과 일치하는 마지막 배열 요소의 인덱스로 확장되거나, 발견되지 않은 경우 0입니다. 이 e플래그는 정확한 일치(패턴 일치 없음)를 수행합니다.

관련 정보