我有一个包含以下子文件夹的主文件夹:
- f1
- f2
每个子文件夹中都有 jpeg/jpg 文件。我这样做find . -maxdepth 2 -type f -iname '*.jp*g'
并得到输出:
- ./f1/IM_48902.jpg
- ./f1/IM_48903.jpg
- ./f2/IM_48900.jpg
- ./f2/IM_48904.jpg
如何从输出中排除“/f1”和“/f2”并获得这样的输出?
- ./IM_48902.jpg
- ./IM_48903.jpg
- ./IM_48900.jpg
- ./IM_48904.jpg
[UPD] 我的完整脚本是find . -maxdepth 2 -type f -iname '.jpg' ! -path "/excluded/" -print0 | xargs -I{} -0 -n1 -P3 sh -c 'exiv2 -q -K Xmp.dc.creator -K Xmp.photoshop.Credit -Pv "$1" > "/Users/adm/Desktop/$1.out"' -- {}
答案1
通过 GNU find,使用该-printf
操作。看man find
find . -maxdepth 2 -type f -iname '*.jp*g' -printf "%f\n"
答案2
find . -maxdepth 2 -type f -iname '*.jp*g'
一般来说,您可以通过以下方式运行输出sed
:
% mkdir f1 f2; touch f1/abc f2/def
% find . -type f |sed -e 's:.*/:./:'
./def
./abc
但如果您需要对 NUL 分隔的“行”执行此操作,则需要一个支持该功能的 sed,例如sed -z
使用 GNU sed。
或者,您可以稍后通过扩展删除 shell 命令中的前缀,${var##pattern}
从而从值中删除最长的匹配前缀。
$ find . -type f -print0 | xargs -I{} -0 sh -c 'echo "./${1##*/}"' -- {}
./def
./abc