Pra*_*r-M 0 bash shell-script rm
我有一个包含大量文件的文件夹。
我想从文件夹中删除以下文件。
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
Run Code Online (Sandbox Code Playgroud)
需要删除的文件不遵循特定模式,因此我无法使用通配符或模式。此外,如果我使用模式,我有删除意外文件的风险。由于我知道要删除的确切文件名,因此我计划将所需文件存储为列表,然后使用for循环将其删除
for i in $list; do
rm $i -f;
done
Run Code Online (Sandbox Code Playgroud)
如何将其存储为列表然后执行此for列表?
使用问题for i in $list在“为什么我的 shell 脚本会因空格或其他特殊字符而阻塞? ”和“忘记在 bash/POSIX shell 中引用变量的安全隐患”中进行了描述。
假设name.list包含一个手动整理的文件名列表,这些文件名指的是当前目录中的文件,每一行都有一个文件名:
while IFS= read -r name; do
rm -f "./$name"
done <name.list
Run Code Online (Sandbox Code Playgroud)
这会将每个名称读入变量name,并rm -f使用变量的值进行调用。如果文件不存在,则不会输出错误(由于-f)。值 in$name将./在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
Run Code Online (Sandbox Code Playgroud)
或者,使用xargs:
xargs -t -I {} rm -f ./{} <name.list
Run Code Online (Sandbox Code Playgroud)
这将调用rm -f文件每一行的内容name.list。启用“跟踪模式”的-t选项xargs,这将显示由xargs.