Encontre a última data editada do arquivo (comportamento estranho do exec)

1

Estou tentando obter as últimas datas modificadas de todos os documentos do Word em todos os diretórios abaixo deste

$ pwd
/run/user/1000/gvfs/smb-share:server=myServer,share=myResources

Se eu fizer um encontro regular, ele retorna exatamente o que eu esperava.

$ find . -name "*.do*"
> ./AnsettGoldenWing/Project Sheets/Ansett Golden Wing Text.doc
> ./B000114/Text/060913__B000114.doc
> ./B000170/B000170_projectdetails.doc
> ./B000208/Text Files/archive/060913__B000208.doc

Mas se eu adicionar o -exec que formata os resultados, tudo vai para o pote.

$ find . -name "*.do*" -exec sh -c "stat --printf='%n --- %y \n' {}" \; > fileInfo.txt
> stat: cannot stat ‘./AnsettGoldenWing/Project’: No such file or directory
> stat: cannot stat ‘Sheets/Ansett’: No such file or directory
> stat: cannot stat ‘Golden’: No such file or directory
> stat: cannot stat ‘Wing’: No such file or directory
> stat: cannot stat ‘Text.doc’: No such file or directory
> stat: cannot stat ‘./B000208/Text’: No such file or directory
> sh: 1: Spa: not found
> stat: cannot stat ‘./B000503/Submission/Hyatt’: No such file or directory

Como faço para produzir:

> ./AnsettGoldenWing/Project Sheets/Ansett Golden Wing Text.doc --- date
> ./B000114/Text/060913__B000114.doc --- date
> ./B000170/B000170_projectdetails.doc --- date
> ./B000208/Text Files/archive/060913__B000208.doc --- date

Sou relativamente novo na linha de comando e esta é a primeira vez que uso um -exec com find , então ainda parece magia negra para mim.

    
por Ben 14.04.2014 / 05:09

2 respostas

4

O problema são os espaços em branco no seu nome de arquivo. Seu novo shell não o trata como literal e o interpreta como arquivos separados.

Você pode usar a opção -print0 com o comando xargs :

find . -name "*.do*" -print0 | xargs -0 stat --printf='%n --- %y \n'

ou usando o comando -exec com + em vez de \; :

find . -name "*.do*" -exec stat --printf='%n --- %y \n' {} +

Geralmente, você deve evitar chamar o novo shell, porque você não pode garantir que seu resultado (nome do arquivo, neste caso) seja interpretado como segurança pelo novo shell.

    
por 14.04.2014 / 05:25
2

Você precisa citar para proteger os espaços em branco:

find . -name "*.do*" -exec sh -c "stat --printf='%n --- %y \n' '{}'" \;
    
por 14.04.2014 / 05:14

Tags