从 -print0 中删除最后 n 个字符?

从 -print0 中删除最后 n 个字符?

目前我有:

@find . -type f -name "img*_01.png" -print0 | python script.py -f {}

有没有办法像这样修剪最后几个字符?

@find . -type f -name "img*_01.png" -print0 | python script.py -f {}.rightTrim(n)

答案1

假设你的意思是:

find . -type f -name "img*_01.png" -print0 |
  xargs -r0I{} python script.py -f {}

这不能用 来完成xargs,因为xargs没有右修剪()操作员。您可以取消xargs并执行类似 ( bash,zsh语法) 的操作:

find . -type f -name "img*_01.png" -print0 |
  while IFS= read -rd '' file; do
    python script.py -f "${file%?????}"
  done

或者保留xargs但调用 shell 来进行修剪:

find . -type f -name "img*_01.png" -print0 | xargs -r0 sh -c '
  for file do
    python script.py -f "${file%?????}"
  done' sh

但在这种情况下,您也可以使用标准-exec {} +语法:

find . -type f -name "img*_01.png" -exec sh -c
  for file do
    python script.py -f "${file%?????}"
  done' sh {} +

或者(如果您不需要完整的文件名),将输出通过管道传输到某个命令,该命令会修剪每个文件名的最后 5 个字符:

sed -zE 's/.{5}$//' # assuming recent GNU sed

或者

awk -v RS='\0' -v ORS='\0' '{print substr($0,1,length-5)}'

(假设 GNUawk或最新版本的mawk)。

在 GNU 系统上,您还可以使用基本的单任务实用程序来完成此操作:

tr '\n\0' '\0\n' | rev | cut -c 6- | rev | tr '\n\0' '\0\n'

并且总是有perl

perl -0 -pe 's/.{5}$//'
perl -0 -lpe 'chop;chop;chop;chop;chop'
perl -0 -lpe 'substr($_,-5,5,"")'

相关内容