假设我在名为的文件夹中有 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
(新创建的)。
不覆盖的不会被删除
我怎样才能从数组中过滤掉这个?
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
标志执行完全匹配(无模式匹配)。