Это - решение:
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
Несколько вариантов:
awk '
function basename(file) {
sub(".*/", "", file)
return file
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Или:
awk '
function basename(file, a, n) {
n = split(file, a, "/")
return a[n]
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Обратите внимание, что эти реализации basename
должны работать для общие случаи, но не в угловых случаях, таких как basename / path / to / x ///
, где они возвращают пустую строку вместо x
или /
, где они вернуть пустую строку вместо /
, хотя для обычных файлов этого не должно происходить.
Первый не будет работать должным образом, если пути к файлам (до последнего /
) содержат последовательности байтов, которые не образуют допустимые символы в текущей локали (обычно такое происходит в Локали UTF-8 с именами файлов, закодированными в некотором 8-битном однобайтовом наборе символов). Вы можете обойти это, установив языковой стандарт на C, где каждая последовательность байтов формирует допустимые символы.
Попробуйте этот однострочный awk,
$ awk 'END{ var=FILENAME; split (var,a,/\//); print a[5]}' /home/abc/imp/asgd.csv
asgd.csv
В системах, где доступна команда basename
, можно использовать функцию awk
system()
или структуру expression | getline var
для вызова внешней команды basename
. Это может помочь в учете крайних случаев, упомянутых в ответе Стефана .
$ awk '{cmd=sprintf("basename %s",FILENAME);cmd | getline out; print FILENAME,out; exit}' /etc///passwd
/etc///passwd passwd