如何从输入文件读取令牌以删除其中提到的文件

如何从输入文件读取令牌以删除其中提到的文件

我正在创建一个使用包含文件夹和 File_Prefix 的配置删除文件的脚本。

  • 这将是配置文件: config.txt

    /local/FolderA,App
    /local/FolderB,Log
    /local/FolderC,File
    
  • 这是我的脚本:

    file="local/config.txt"
    while IFS="," read -r folder prefix;
    do
        find %s -name %s* -type f -exec rm {} \ "$folder" "$prefix";
    done < "$file"
    

但是它无法正常工作。您能帮助解决问题吗?我在从命令分配值时遇到麻烦IFS

答案1

假设您的配置文件不包含嵌入换行符或逗号的字段,并假设您只想删除指定目录中具有上述文件名前缀的所有文件(即不递归):

#!/bin/sh

while IFS=, read -r directory prefix; do
    rm -- "$directory/$prefix"*
done <config.txt

这会将每行上的第一个逗号分隔字段读入directory变量,并将行的其余部分读入prefix变量。然后它使用这些来删除文件。 (看“--”(双破折号)参数记录在哪里?有关的解释--

如果您需要在每个提到的目录路径下递归地进行删除:

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt

find除了递归搜索之外,这两者之间的区别在于$prefix,它将像find命令中的通配模式一样使用。

请注意,*使用 with 时需要加引号,find以便 shell 不会将其扩展为匹配当前目录中的名称,并且*应该是未引用的当在上面的第一个循环中使用 with 时rm,shell 将其扩展到所有匹配的名称。

如果你想要递归地进行删除,但是您有太多与生成的模式匹配的文件,因此第一个循环会给您一个“参数列表太长”错误,那么您可能需要执行一个额外的内部循环,

#!/bin/sh

while IFS=, read -r directory prefix; do
    for pathname in "$directory/$prefix"*; do
        rm -- "$pathname"
    done
done <config.txt

或使用find仅限于顶级搜索路径,

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt

答案2

我们使用 xargs 将文件路径从 config.txt 文件传递​​到命令行中的 sh 可执行文件。

< config.txt xargs -rd'\n' sh -c '
for arg do
 find "${arg%,*}" \
    -name "${arg##*,}*" \
    -type f \
    -exec rm -f {} + ;
done
' xargs-sh

相关内容