Извлечь имя файла из файла, используя скрипт
У меня есть текстовый файл, который имеет следующую строку:
/u/tux/abc/spool/frtbla_mcdetc_0000149099_20101126135009990_1.tif
Я хочу извлечь frtbla_mcdetc_0000149099_20101126135009990_1.tif
; слово после последней косой черты (/
).
5 ответов
Если вы находитесь в Linux-подобной среде, вы можете использовать basename
полезность:
basename $(<your_file)
Если вы знаете точный формат структуры каталогов и она не изменится, вы можете использовать cut
:
$ cut -f6 -d '/' file.txt
Здесь используется cut для обработки разделителей каталогов как разделителя и извлечения шестого.
Если вместо этого все, что вы знаете, это последняя часть строки, но не знаете структуру каталогов, вы можете использовать rev
также:
$ rev file.txt | cut -f1 -d '/' | rev
Здесь файл переворачивается, и первое поле извлекается перед повторным обращением.
Я не знаю, что такое стандартная оболочка в Aix, но bash
доступно и поддерживает редактируемое расширение переменных.
Если ваше полное имя находится в переменной FileName
, затем ${FileName##*/}
отображает имя с удалением всех ведущих символов до последнего /
; в отличие от ${FileName#*/}
удаляет до первого /
, в то время как ${FileName%/*}
удаляет завершающие символы из последнего /
(т.е. путь к каталогу).
Если вы генерируете имена файлов с помощью find
команда, тогда вам нужна команда, как:
find ... | while read FileName; do echo ${FileName##*/}; done
Если в текстовом файле:
while read FileName; do echo ${FileName##*/}; done < FileList.txt
Заменить echo
Команда любой обработки вам нужно сделать с именем.
Следующее применимо ко всем строкам в оболочке, а не только к именам файлов, и это гораздо проще, чем вырезать, потому что вам не нужно знать, сколько есть полей перед тем, которое вы хотите:
$ foo=/path/to/file/split/by/slashes.txt
$ echo ${foo##*/}
slashes.txt
При этом используется "жадная обрезка", то есть обрезка всего до последнего "/", как описано здесь:
https://stackoverflow.com/questions/3162385/how-to-split-a-string-in-shell-and-get-the-last-field
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
/ <-- until the last '/'
}