删除与另一个名称列表部分匹配的文件

delete files with partial match to another list of names

我在 file1 中有一个名称列表,它是我要删除的文件的真实文件名的子字符串。我想删除与 file1 中的名称部分匹配的文件。知道如何指定要删除的文件吗?

文件 1:

  file123
  file313
  file355

真实文件:

  file123.sam.out
  file313.sam.out
  file355.sam.out
  file342455.sam.out
  file34455.sam.out

要保留的文件:

  file342455.sam.out
  file34455.sam.out
#!/bin/bash

PATTERN_FILE=file1
FILE_TO_REMOVE_FOLDER=files

cat $PATTERN_FILE | while read x
do
    if [ "" != "$x" ]
    then
        echo "rm $FILE_TO_REMOVE_FOLDER/$x*"
        rm $FILE_TO_REMOVE_FOLDER/$x*
    fi
done

假设您没有任何包含换行文字的文件名...

printf '%s\n' * | grep -Fvf file1 | xargs -d $'\n' rm -f --

让我们来看看这个 piece-by-piece:

  • printf '%s\n' * 生成当前目录中的文件列表。
  • grep -Fvf file1 从该列表中删除任何包含来自 file1
  • 的行作为子字符串的字符串
  • xargs -d $'\n' rm -f -- 在换行符上拆分它的标准输入,并将它留下的任何内容作为参数传递给 rm -f --

如果您有 GNU 工具(和 shell,如 bash,支持进程替换),您可以使用 NUL 分隔符,从而处理所有可能的文件名:

printf '%s[=11=]' * |
  grep -zFvf <(tr '\n' '[=11=]' <file1) |
  xargs -0 rm -f --
  • printf '%s[=17=]' * 在每个文件名后放置一个 NUL,而不是换行符。
  • tr '\n' '[=18=]' <file1 发出 file1 的内容,换行符替换为 NULs
  • grep -zFvf 将其输入读取为 NUL-delimited,并写入 NUL-delimited 输出,但其他行为如上。
  • xargs -0 rm -f -- 读取内容,在 NUL 上拆分,并将输入作为参数传递给 rm -f --