我在子文件夹下有不少具有不同扩展名的文件,例如“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