我正在尝试递归地从find命令中检索文件名。此命令使用完整路径打印所有文件名
> for f in $(find -name '*.png'); do echo "$f";done
> ./x.png
> ./bg.png
> ./s/bg.png
但当我试图使用这些命令来获取文件名时,它会打印
for f in $(find -name '*.png'); do echo "${f##*/}";done
bg.png
和
for f in $(find -name '*.png'); do echo $(basename $f);done
bg.png
它省略了其他2个文件。我是shell脚本的新手。我想不出这个怎么了。
编辑:
这正是我真正想要的。
- 我想递归地循环浏览一个目录并找到所有的png图像
- 发送给pngnq进行RGBA压缩
- 它输出带有
orgfilename-nq8.png
的新文件 - 将其发送到pngcrush并重命名并生成一个新文件(组织文件将被覆盖)
- 删除新文件
我有一个在单一目录上工作的代码
for f in *.png; do pngnq -f -n 256 "$f" && pngcrush "${f%.*}"-nq8.png "$f";rm "${f%.*}"-nq8.png; done
我想递归地完成
简单操作:
find -name '*.png' -printf '%fn'
如果你想为每个文件运行一些东西:
find -name '*.png' -printf '%fn' |
while read file; do
# do something with "$file"
done
或使用xargs
:
find -name '*.png' -printf '%fn' | xargs -n1 command
请确保您不能像这样直接使用find
:
find -name '*.png' -exec command {} +
或
find -name '*.png' -exec bash -c 'do_something with ${1##*/}' -- {} ;
在上搜索-printf
http://unixhelp.ed.ac.uk/CGI/man-cgi?find或在中
man find | less +/^' *-printf'