나는 종종 Android 휴대폰을 사용하여 오디오 파일을 WAV 파일로 휴대폰 내부 저장소에 녹음합니다. 최근에 녹음된 파일을 휴대폰에서 추출하여 데스크탑으로 옮기는 Bash 스크립트를 작성하고 싶습니다. 이것이 내가 지금까지 얻은 것입니다:
adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while read file ; do
adb pull "$file" ~/Desktop/
done
그러나 이는 실패했습니다. ADB가 올바르게 이스케이프되지 않은 것 같고 스크립트를 실행하려고 하면 다음 메시지가 나타납니다.
' does not existstorage/sdcard0/Sound Recordings/20120817T065953.wav
큰따옴표를 무시하는 것처럼 보이며 실행을 시도하면 다음과 같이 두 개가 아닌 세 개의 인수가 표시될 수 있으므로 기본적으로 모든 것이 중단됩니다.
adb pull /storage/sdcard0/Sound Recordings/20120817T065953.wav ~/Desktop/
$file
필요한 경우 변수에 백슬래시를 삽입 하도록 스크립트를 어떻게 조정합니까 ? 이 경우 이것이 올바른 해결책입니까?
답변1
다른 쉘 레벨에서 실행 중이므로 확장됩니다.앞으로서브쉘에서 실행됩니다. 이 문제를 해결하는 가장 쉬운 방법은 파일 이름의 모든 특수 문자를 이스케이프 처리하는 것입니다.
adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while IFS= read -r file ; do
adb pull "$(printf %q "$file")" ~/Desktop/
done
답변2
해결책은 다음과 같습니다.
adb pull "/storage/sdcard0/Sound Recordings/$(
adb shell ls -1t '/storage/sdcard0/Sound Recordings' |
sed q |
tr -d '\r'
)" .
adb
Windows가 일부 캐리지 리턴을 반환하는 것처럼 문제가 발생했습니다.\r
sed q
첫 번째 발생을 보여주는 재미있는 방법입니다.head -n1