다음과 같은 폴더에 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.py
B.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
이는 각 파일을 $f
Normal.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
플래그는 정확한 일치(패턴 일치 없음)를 수행합니다.