O find
comando possui um operador útil -printf
que imprime metadados especificados pelo usuário para cada arquivo/pasta encontrado. Existe essa opção para o ls
comando?
Como alternativa, posso alimentar a lista de nomes de arquivos de interesse
find
em vez de ls
, mas parece que estou usando uma marreta rapidamente. Já tenho os arquivos de interesse e não estou realmente "encontrando" nada.
Além disso, alimentar os caminhos find
seria complicado porque não posso simplesmente anexar os caminhos de arquivo desejados ao final de um find
comando. O find
comando exige que os caminhos venham antes dos operadores (ou "predicados"). Por esse motivo, não consigo aproveitar "xargs" facilmente.
Obrigado ao steeldriver por sua resposta. Acho que o uso dele stat
seria uma solução se eu estivesse começando do zero. Infelizmente, tenho que comparar a saída com informações semelhantes que já foram geradas em outros sistemas, especificamente usando find
's printf
.
Aqui estão alguns idiomas de código find
que descobri que funcionam:
# Option 1
Some Command \
| xargs -n 1 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
# Option 2
Some Command | tr '\n' '\0' \
| xargs -0 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
Com base no comentário de muru , aqui está um idioma de código que não consegui funcionar porque meu Gnu find
do Cygwin é anterior à versão 4.9 e não reconhece o predicado -files0-from
:
Some Command | tr '\n' '\0' \
| find -files0-from - -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
Não com a implementação GNU de
ls
¹ até onde eu sei, porém é possível com algumas implementações destat
.Por exemplo
stat
, do GNU Coreutils,stat --printf '%n\t%y\t%s\n'
fornecerá os campos e delimitadores que você deseja, embora (afaik) não forneça controle refinado do formato de data e hora².Se
zsh
for uma opção, você pode usar o zsh/stat Module , talvez definindo sua própria função shell com a saída exata desejada:Alternativamente, você pode fazer o que quiser com um script perl simples usando sua função lstat , por exemplo
Em qualquer caso, isso
-printf
é específico para a implementação do GNUfind
(embora existisse décadas antes de umstat
comando GNU ser adicionado). Com o GNUfind
4.9 ou mais recente, você pode passar uma lista arbitrária de caminhos de forma confiável com o-files0-from
predicado:Em qualquer caso, observe que TAB e NL são caracteres tão válidos quanto qualquer outro em um caminho de arquivo, de modo que a saída não pode ser analisada de forma confiável (o formato do carimbo de data/hora que pode ser simplificado também é
%F %R
ambíguo, pois faltam as informações de fuso horário).Todos eles fazem uma verificação
lstat()
nos arquivos, de modo que, para aqueles do tipo link simbólico , eles relatem as informações sobre o link simbólico em si, e não sobre o arquivo para o qual eventualmente resolvem. Para fazer issostat()
(e relatar as informações após a resolução do link simbólico), adicione a-L
opção a GNUstat
ou GNUfind
, remova-a de zsh stat, remova a-P
opção de ast-open'sls
e substitualstat
porstat
noperl
script.¹ a implementação ast-open funciona com
ls -PdZ '%(name)s\t%(mtime:time=%Y-%m-%d %H:%M)s\t%(size)s' -- "$@"
(mesma sintaxe dopax
comando padrão ), mas AFAIK, esse não está mais sendo mantido.² GNU
stat
também falha no arquivo chamado,-
pois o interpreta como significando executar umfstat()
on stdin; O zshstat
(que antecede o GNU em alguns anos) não tem esse problema e tem uma função-f FD
para executar umfstat()
descritor de arquivo arbitrário.