如何仅删除文件扩展名,同时保留其他部分

如何仅删除文件扩展名,同时保留其他部分

我在子文件夹下有不少具有不同扩展名的文件,例如“aaa”

/f1/aaa/a.txt
/f1/aaa/a.sql
/f1/f2/aaa/b.txt
/f1/f2/aaa/b.csv

我需要的是从 /f1 中提取所有这些文件并仅删除它们的扩展名:

/f1/aaa/a
/f1/f2/aaa/b

答案1

如果“提取并删除它们的扩展”是指在进行过程中重命名它们,那么这样就可以实现。

find f1 -path "*/aaa/*" -type f -exec bash -c 'mv -i -- "$0" "${0%.*}"' {} \;

或者,仅打印不带扩展名的文件:

find f1 -path "*/aaa/*" -type f -exec bash -c 'echo "${0%.*}"' {} \;

您不应grep逐一检查find的输出,而应使用其内置的过滤功能来查找匹配的文件。否则,您会得到包含字符串 的文件的误报aaa

文件名替换应始终引用以防止空格或 shell glob 模式被扩展。

此外,find输出不应通过管道传输到while除非您使用空分隔符来分隔输出。如果您真的只是想对每个文件“做一些事情”,则无需通过管道传输while。使用选项可以实现相同的效果-exec

如果您需要find … | while,那么这样更安全(不要忘记引用文件名):

find … -print0 | while IFS= read -r -d '' file; do command "$file"; done

相关内容