如何从庞大的文件列表中删除某些特定文件

如何从庞大的文件列表中删除某些特定文件

我有一个包含大量文件的文件夹。

我想从文件夹中删除以下文件。

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)。$namewill中的值./之前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 陷阱,很容易发生事故。

相关内容