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.