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.pyC.py是用normal.py模板创建的,但B.py保持不变。

现在我想要一个删除的功能 A.pyC.py(新创建的)。
不覆盖的不会被删除

我怎样才能从数组中过滤掉这个?

PS:我还是个菜鸟。无法在我的脚本中实现此功能。
脚本应该像这样删除rm -i {A,C}.py

在这里看到了这个线程
Bash - 如何查找不在数组中的所有文件

笔记:用户输入未定义,不是三个。

答案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 进行比较。当且仅当cmp返回 0(真)时,“$f”才会被删除。

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标志执行完全匹配(无模式匹配)。

相关内容