Извлеките имя файла из пути в awk программе

Это - решение:

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

22
04.06.2014, 01:42
3 ответа

Несколько вариантов:

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, где каждая последовательность байтов формирует допустимые символы.

33
27.01.2020, 19:42

Попробуйте этот однострочный awk,

$ awk 'END{ var=FILENAME; split (var,a,/\//); print a[5]}' /home/abc/imp/asgd.csv
asgd.csv
10
27.01.2020, 19:42

В системах, где доступна команда basename, можно использовать функцию awksystem()или структуру expression | getline varдля вызова внешней команды basename. Это может помочь в учете крайних случаев, упомянутых в ответе Стефана .

$ awk '{cmd=sprintf("basename %s",FILENAME);cmd | getline out; print FILENAME,out; exit}' /etc///passwd
/etc///passwd passwd
4
27.01.2020, 19:42

Теги

Похожие вопросы