我正在创建一个使用包含文件夹和 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