我正在玩-exec
find 命令的标志。我正在尝试使用该标志来打印文件的扩展名,使用相当新的 Linux 发行版。
从简单开始,这有效:
find . -type f -exec echo {} \;
尝试使用方便的 Bash 字符串功能失败:
find . -type f -exec echo "${{}##*.}" \; (bad substitution)
那么正确的做法应该是什么呢?
答案1
如果您想使用 shell 参数扩展,请使用以下命令运行一些 shell exec
:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
答案2
find . -type f | while read file; do echo "${file##*.}"; done
具有绕过所有没人能记住的棘手的 exec 语法的优点。
还有一个优点是只创建一个子进程,而不是为每个找到的文件创建和销毁一个子进程。这比 jimmij 使用 exec 的版本要快得多
# Preparation - 1000 files
for i in {1..1000}; do touch $i.$i; done
>time find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
real 0m21.906s
user 0m6.013s
sys 0m12.304s
>time find . -type f | while read file; do echo "${file##*.}"; done
real 0m0.219s
user 0m0.125s
sys 0m0.087s