如果文件名不在文本文件中,如何从目录中删除文件? Bash脚本

时间:2018-03-16 12:23:00

标签: bash scripting filenames delete-file

我正在编写一个bash脚本,并希望它告诉我目录中文件的名称是否出现在文本文件中,如果没有,请删除它们。

这样的事情:

counter = 1
numFiles = ls -1 TestDir/ | wc -l 
while [$counter -lt $numFiles]
do
     if [file in TestDir/ not in fileNames.txt]
     then
          rm file
     fi
     ((counter++))
done

所以我需要帮助的是if语句,它仍然是伪代码。

2 个答案:

答案 0 :(得分:1)

您可以大量简化脚本逻辑:

#/bin/bash

# for loop to iterate over all files in the testdir
for file in TestDir/*
do
    # if grep exit code is 1 (file not found in the text document), we delete the file
    [[ ! $(grep -x "$file" fileNames.txt &> /dev/null) ]] && rm "$file"
done

答案 1 :(得分:0)

看起来你有一个有效的解决方案,但我认为我也提供这个,因为它可能对你或其他人有帮助。

find /Path/To/TestDir -type f ! -name '.*' -exec basename {} + | grep -xvF -f /Path/To/filenames.txt"

击穿

find :这将获取与指定条件匹配的指定目录(即TestDir)中的文件路径。在这种情况下,我已指定它仅返回常规文件( -type f ),其名称不以句点开头( -name '.*' < /强>)。然后它使用自己的内置实用程序来执行下一个命令:

basename鉴于文件路径(find吐出的内容),它将仅返回基本文件名,或者更具体地说,返回最后一个文件路径后的所有内容/

|这是一个命令管道,它将上一个命令的输出用作下一个命令中的输入。

grep这是一个正则表达式匹配工具,在这种情况下,会给出两个文件列表:一个从find通过管道输入 - 您TestDir目录的文件;以及filenames.txt中列出的文件。通常,文本文件中的文件名将用于匹配find返回的文件名,匹配的文件名将作为输出。但是, -v 标记会反转匹配过程,以便grep返回匹配的文件名。

目录TestDir中存在的文件列表的结果是什么,但出现在filenames.txt文件中。这些是您要删除的文件,因此您只需在参数展开 $(...) 中使用此行代码即可提供 rm 文件,它能够删除。

完整的命令链 - 在cd进入TestDir之后 - 看起来像这样:

rm $(find . -type f ! -name '.*' -exec basename {} + | grep -xvF -f filenames.txt")