Tentando obter o comando ADB no Linux (para copiar timestamps) para trabalhar com espaços em nomes

2

Usando o Linux Mint 13, tenho tentado copiar arquivos e diretórios para um Android conectado via USB. Precisa preservar os timestamps.

(estou ciente de que, no Unix, apenas o tempo de modificação é armazenado).

Recebi um comando do Googling, mas não entendo muito. Link está abaixo. link

Após o push adb, "FROM" "ANDROID_PHONE" Eu uso o comando abaixo:

find . | while read file; do timestamp_stat=$(stat -c "%y" "$file"); timestamp=$(date +"%Y%m%d.%H%M%S" -d "$timestamp_stat"); echo "$timestamp: $file"; adb shell su -c "touch -t $timestamp \"/sdcard/ANDROID_PHONE\""; done

Eu percebo que o comando acima só consegue usar o Touch para copiar timestamps para nomes de arquivos e diretórios sem espaços neles. Receba mensagens de erro, por exemplo. ID desconhecida: R para quem tem espaços.

Como devo corrigir o código?

    
por blue.grux 08.05.2015 / 12:09

1 resposta

1

Eu posso explicar parte disso:


find . é usado para listar todos os arquivos e diretórios no caminho atual (que é o ponto). O Find não é instruído a fazer nada com os resultados, mas o comportamento padrão na maioria das implementações de localização é imprimi-las para std out.

A codificação correta teria usado um find /path/to/pictures -ls ou -print0 . O último é útil quando existem caracteres não padrão no nome (por exemplo, espaços).

A saída nos o comando anterior é então encaminhada para a próxima parte. Isso é feito através do símbolo pipe ( | ).


O próximo comando é empacotado em um loop while (destacado em negrito)

enquanto lê o arquivo; do timestamp_stat = $ (stat -c "% y" "$ arquivo"); timestamp = $ (date + "% Y% m% d.% H% M% S" -d "$ timestamp_stat"); echo "$ timestamp: $ file"; shell adb -c "toque em -t $ timestamp \" / sdcard / ANDROID_PHONE \ ""; concluído

Isto lê de um arquivo (no nosso caso de stdin que contém a saída do comando anterior. Os resultados da leitura são armazenados em uma variável chamada arquivo .

(localiza a saída do > find | - > input para o loop while)


Para cada um desses resultados, o seguinte conjunto de comandos é executado em sequência:

timestamp_stat=$(stat -c "%y" "$file");
timestamp=$(date +"%Y%m%d.%H%M%S" -d "$timestamp_stat"); 
echo "$timestamp: $file"; 
adb shell su -c "touch -t $timestamp \"/sdcard/ANDROID_PHONE\""; 

Um timestamp variável criado e preenchido com os resultados da stat -c
(stat é um utilitário que exibe informações sobre o arquivo apontado pelo arquivo. Nesse caso, o arquivo para o qual ele aponta é armazenado em $ file e empacotado para evitar problemas com espaços.

Os resultados são então substituídos pelas mesmas informações em um formato diferente.

Em seguida, este resultado é echo'd std out. Provavelmente, é por isso que o usuário tem alguma ideia de onde está o script.

Por último, faz algo com abd, com o qual não tenho informações sólidas. Eu acho que é instrui o telefone Android para tocar em um arquivo. Tocar em um arquivo geralmente altera a data em um arquivo para a hora atual. No entanto, neste caso, especifica qual o tempo para definir o arquivo.

A partir da página de toque:

-t      Change the access and modification times to the specified time
        instead of the current time of day.  The argument is of the form
         ''[[CC]YY]MMDDhhmm[.SS]'' where each pair of letters represents
         the following:

Passando para uma solução:

Infelizmente, não aqui, apenas dicas:

  • Alterar o IFS
  • Ou use -print0 (e possível com xargs -0)
  • Use o item enteire para encontrar. Agora mesmo encontrar é usado para encontrar os arquivos e os resultados (incluindo espaços) são então passados para um shell. Encontrar pode fazer as coisas por conta própria embora. Não, enquanto readfile é necessário. um find /path/to/files -exec "something" {} \; pode funcionar melhor e mais rápido.
por 08.05.2015 / 12:25