我正在编写一个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
语句,它仍然是伪代码。
答案 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")