Linux'ta ADB komutunu almaya çalışmak (zaman damgalarını kopyalamak için) isimlerdeki boşluklarla çalışmak


2

Linux Mint 13'ü kullanarak, USB üzerinden bağlı bir Android'e dosya ve dizin kopyalamak için ADB yapmaya çalışıyorum. Zaman damgalarını korumanız gerekir.

(Unix’te sadece Zaman Değiştirme’nin saklandığını biliyorum).

Googling'den bir emir aldım ama fazla anlamadım. Bağlantı aşağıda. https://android.stackexchange.com/questions/35580/how-can-i-transfer-photos-to-my-android-jelly-bean-device-while-preserving-the-o

ADB'dan sonra "FROM" "ANDROID_PHONE" tuşlarına basıp aşağıdaki komutu kullanıyorum:

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

Yukarıdaki komutun, yalnızca dosya adları ve dizinler için boşluk içermeyen zaman damgalarını kopyalamak için Dokunmatik'yı kullandığını anlıyorum. Hata mesajlarını alın, örn. Bilinmeyen kimlik: boşluklu olanlar için R.

Kodu nasıl değiştirmeliyim?


file="$(line)"Bunun yerine kullanırsanız read file, o "$file"zaman öndeki veya sondaki boşlukları (veya yeni satırların dışında diğer karakterleri) içerir. Eğer yoksa line, eşdeğeri kullanabilirsiniz head -n 1. Ama olmamalıdır "$file"içinde adbçağrı?
AFH,

Yukarıdakilere bir göz attığımda .. hala işe yaramıyor. Bulmaya çalıştım. -print0 | dosyayı okurken; Sanırım bu sorunu gidermek için yeterli Linux komutu bilmiyorum ..
blue.grux

Sorunun çift genişleme olabileceğini düşünüyorum: sunucunuz bir kez genişler ve adbkabuk yeniden genişler. adbKomutun hangi dosya touchüzerinde çalışması gerektiğini bilmesi gerektiğini hala anlamıyorum ; ya da ipte özel bir şey var ANDROID_PHONEmı? Geçmişte, Android'i bir USB sürücüsü olarak monte ettim cp --preserve=allve zaman damgalarını başvurmadan korumak için normal kopyayı ( ) kullandım adb. Şimdi WiFi üzerinden kopyalamak için Android'de bir dosya yönetimi uygulaması kullanıyorum ve bu da onları koruyor.
AFH,

Merhaba AFH, Cevabınız için teşekkür ederim. Mesele şu ki, dosyalar için zaman damgaları korunuyor, fakat dizinler için zaman damgaları değil, bu nedenle zaman damgalarını "kopyalamak" için bir komut dosyası / komutun kullanılması gerekiyor. Bu komut dosyası boşluksuz klasörler veya dosya adları için mükemmel çalışır. Karşılaştırma yapmak istediğim klasör ağacının başından itibaren Linux'tan çalıştırıyorum ve yalnızca karşılaştırmak istediğim Android yolunu yansıtacak şekilde "/ sdcard / Download / $ file \" bölümünü düzenlemeniz gerekiyor. Bir Android'i USB sürücüsü olarak monte etmek, daha yeni telefonların artık sahip olmadığı USB Yığın Depolama'yı gerektirir.
blue.grux

Eğer touchAndroid'deki komut touch -t $timestamp "/sdcard/ANDROID_PHONE/$file"o zaman problemin çifte açılım olduğunu görebiliyorum, ancak onsuz "$file"nasıl çalışması gerektiğini takip edemiyorum. Geçerken, dizin zaman damgalarını değiştirmenin olağandışı olduğunu, çünkü içerilen bir dosya veya alt dizin her oluşturulduğunda, silindiğinde ya da yeniden adlandırıldığında güncellenir.
AFH

Yanıtlar:


1

Bir kısmını açıklayabilirim:


find .Geçerli dosyadaki tüm dosyaları ve dizinleri listelemek için kullanılır (nokta budur). Bul ile sonuçlarla ilgili herhangi bir şey yapılması söylenmez, ancak çoğu bulma uygulamasındaki varsayılan davranış onları std olarak yazdırmaktır.

Doğru kodlama bir find /path/to/pictures -lsveya kullanırdı -print0. Sonuncusu, adında standart olmayan karakterler olduğunda kullanışlıdır (örneğin boşluklar).

Bize önceki komutun çıktısı sonraki kısma yönlendirilir. Bu, pipe ( |) sembolü ile yapılır.


Bir sonraki komut bir süre döngüsüne sarılır (kalın harflerle vurgulanır)

dosyayı okurken; do timestamp_stat = $ (istatistik -c "% y" "$ dosya"); timestamp = $ (tarih + "% Y% m% d.% H% M% S" -d "$ timestamp_stat"); echo "$ timestamp: $ file"; adb kabuğu su -c "dokun -t $ timestamp \" / sdcard / ANDROID_PHONE \ ""; tamam

Bu bir dosyadan okur (bizim durumumuzda önceki komutun çıktısını içeren stdin'den gelir. Okuma sonuçları dosya adında bir değişkende saklanır .

(bulur -> find'in çıktısı | -> while döngüsü için girdi)


Bu sonuçların her biri için aşağıdaki komutlar sırayla gerçekleştirilir:

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\""; 

Stat -c'den elde edilen sonuçlarla oluşturulan ve doldurulan bir değişken zaman damgası
(stat, bir yardımcı programdır, dosyada gösterilen dosya hakkında bilgi görüntüler. Bu durumda işaret ettiği dosya $ dosyasında saklanır ve boşluklarla ilgili sorunlardan kaçınmak için alıntı yapılır. .

Sonuçlar daha sonra aynı bilgi ile farklı bir formatta değiştirilir.

Daha sonra bu sonuç yankılanacak. Bu muhtemelen kullanıcının betiğin nerede olduğu hakkında bir fikri vardır.

Son olarak, hiçbir bilgim olmayan abd ile bir şeyler yapıyor. Sanırım android telefona bir dosyaya dokunması talimatı veriyor. Bir dosyaya dokunmak genellikle bir dosyadaki tarihi geçerli saate değiştirir. Ancak bu durumda dosyayı ne zaman ayarlayacağınızı belirtir.

Dokunmatik sayfadan:

-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:


Bir çözüme geçme:

Ne yazık ki burada değil, sadece ipuçları:

  • IFS'yi değiştir
  • Veya -print0 kullanın (ve xargs -0 ile mümkündür)
  • Enteire olayını bulmak için hareket ettirin. Şu anda Bul dosyaları bulmak için kullanılır ve sonuçlar (boşluklar dahil) daha sonra bir kabuğa geçirilir. Bul kendi başına şeyler yapabilir. Okuma dosyası gerektiğinde hayır. bir find /path/to/files -exec "something" {} \;daha iyi ve daha hızlı çalışabilir.

find <path> -exec <something> {} \;çoğu durumda aslında daha yavaş. Çünkü <something>her tekrarda başlayacak . Birçok araç isteğe bağlı sayıda girdi dosyası alabilir; bu durumda files=$(find <path> -print) && <something> $files, yalnızca bir <something>kez başladığından, daha hızlı olur .
Gx1sptDTDa

Doğru. Bazen \ + 'ı bularak bu konuda çalışabilirsiniz.
Hennes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.