Remova os últimos n caracteres de -print0?

0

Atualmente, tenho:

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

Existe uma maneira de aparar os últimos caracteres como este?

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

    
por sp334 21.07.2016 / 08:17

1 resposta

4

Supondo que você quis dizer:

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

Isso não pode ser feito com xargs , como em xargs não tem operador rightTrim () . Você pode acabar com xargs e fazer algo como ( bash , zsh syntax):

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

Ou mantenha xargs , mas invoque um shell para fazer o recorte:

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

Embora, nesse caso, você também possa usar a sintaxe -exec {} + padrão:

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

Ou (se você também não precisar do nome completo do arquivo), canalize a saída para algum comando que apare os últimos 5 caracteres de cada nome de arquivo:

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

ou

awk -v RS='
tr '\n
perl -0 -pe 's/.{5}$//'
perl -0 -lpe 'chop;chop;chop;chop;chop'
perl -0 -lpe 'substr($_,-5,5,"")'
' '
find . -type f -name "img*_01.png" -print0 |
  xargs -r0I{} python script.py -f {}
\n' | rev | cut -c 6- | rev | tr '\n
find . -type f -name "img*_01.png" -print0 |
  while IFS= read -rd '' file; do
    python script.py -f "${file%?????}"
  done
' '
find . -type f -name "img*_01.png" -print0 | xargs -r0 sh -c '
  for file do
    python script.py -f "${file%?????}"
  done' sh
\n'
' -v ORS='
find . -type f -name "img*_01.png" -exec sh -c
  for file do
    python script.py -f "${file%?????}"
  done' sh {} +
' '{print substr($0,1,length-5)}'

(assumindo o GNU awk ou versões recentes do mawk ).

Nos sistemas GNU, você também pode fazer isso com utilitários básicos de uma tarefa com:

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

E sempre há perl :

awk -v RS='
tr '\n
perl -0 -pe 's/.{5}$//'
perl -0 -lpe 'chop;chop;chop;chop;chop'
perl -0 -lpe 'substr($_,-5,5,"")'
' '%pre%\n' | rev | cut -c 6- | rev | tr '\n%pre%' '%pre%\n'
' -v ORS='%pre%' '{print substr($0,1,length-5)}'
    
por 21.07.2016 / 08:57