我有一个包含大量文件的文件夹。
我想从文件夹中删除以下文件。
ni_mayb17000.mol2
ni_mayb50000.mol2
ni_fda.mol2
ni_mayb2000.mol2
ni_mayb5000.mol2
ni_in_trials1000_2999.mol2
ni_in_trials1-999.mol2
ni_in_trials5000.mol2
ni_intrials8000.mol2
ni_intrialsfinal.mol2
ni_mayb13000.mol2
ni_mayb21000.mol2
ni_mayb45000.mol2
ni_mayb55000.mol2
ni_mayb25000.mol2
ni_mayb60000.mol2
ni_mayb30000.mol2
ni_mayb8000.mol2
ni_mayb35000.mol2
ni_mayb_f.mol2
ni_mayb40000.mol2
ni_world_not_fda.mol2
需要删除的文件不遵循特定模式,因此我无法使用通配符或模式。另外,如果我使用模式,我就有删除意外文件的风险。由于我知道要删除的确切文件名,因此我计划将所需的文件存储为列表,然后使用循环删除for
它
for i in $list; do
rm $i -f;
done
如何将其存储为列表,然后执行此for
列表?
答案1
使用问题for i in $list
在“为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?“ 和 ”忘记在 bash/POSIX shell 中引用变量的安全隐患”。
假设name.list
包含手动整理的文件名列表,引用当前目录中的文件,每行一个文件名:
while IFS= read -r name; do
rm -f "./$name"
done <name.list
这会将每个名称读入变量name
,并rm -f
使用变量的值进行调用。如果文件不存在,则不会输出任何错误(由于-f
)。$name
will中的值./
之前rm
被调用以限制删除对当前目录的影响。
一个稍微复杂的变体,在遍历文件名列表时产生一些输出:
while IFS= read -r name; do
if [ -e "./$name" ]; then
printf 'Removing "%s"\n' "$name"
rm -f "./$name"
else
printf 'Did not find "%s"\n' "$name"
fi
done <name.list
或者,使用xargs
:
xargs -t -I {} rm -f ./{} <name.list
这将调用rm -f
文件每一行的内容name.list
。启用“跟踪模式”-t
的选项,xargs
该模式将显示xargs
.
答案2
如果您将它们放在文件中,例如filelist.txt
,您可以尝试以下循环
while IFS= read -r filename
do
rm "$filename"
done < filelist.txt
但是,请务必在实际删除文件之前进行测试(例如,将 替换rm "$filename"
为echo "Would now remove $filename"
)。
答案3
如果你知道要删除的确切文件名,然后直接删除它们:
rm file1 file2 ...
并跳过将它们保存到另一个文件并使用 shell 循环重新读取该文件的步骤。然后您可能想删除该文件名!效率是仁者见仁,但rm file1 ...
它只是一个命令,而其他方法则需要几个步骤,如果省略引用或其他 shell 陷阱,很容易发生事故。