从“find .”的文件名中排除路径命令

从“find .”的文件名中排除路径命令

我有一个包含以下子文件夹的主文件夹:

  • 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

相关内容