Использование LS для определенного пути и типа файла без восстановления полного пути к файлу?

Я пишу сценарий bash и хотел бы использовать LS, указав ему путь/*.tar, и вернуть только имена файлов вместо полного пути и имени файла, чтобы передать имена файлов через чтение в массив, ниже показано, что происходит в Терминал:

Если я просто использую LS с каталогом, он возвращает:

admin@linuxbox:~$ ls  /home/admin/Backup/
0_BuIndex.txt.backup  Backup1376238064.tar  Backup1376239611.tar  Backup1376241919.tar
Backup1376167035.tar  Backup1376238960.tar  Backup1376240158.tar  Backup1376243097.tar
Backup1376168581.tar  Backup1376239110.tar  Backup1376241421.tar
Backup1376237070.tar  Backup1376239350.tar  Backup1376241489.tar
Backup1376237928.tar  Backup1376239479.tar  Backup1376241608.tar

Давая путь и тип файла, он возвращает:

admin@linuxbox:~$ ls  /home/admin/Backup/*.tar
/home/admin/Backup/Backup1376167035.tar  /home/admin/Backup/Backup1376239479.tar
/home/admin/Backup/Backup1376168581.tar  /home/admin/Backup/Backup1376239611.tar
/home/admin/Backup/Backup1376237070.tar  /home/admin/Backup/Backup1376240158.tar
/home/admin/Backup/Backup1376237928.tar  /home/admin/Backup/Backup1376241421.tar
/home/admin/Backup/Backup1376238064.tar  /home/admin/Backup/Backup1376241489.tar
/home/admin/Backup/Backup1376238960.tar  /home/admin/Backup/Backup1376241608.tar
/home/admin/Backup/Backup1376239110.tar  /home/admin/Backup/Backup1376241919.tar
/home/admin/Backup/Backup1376239350.tar  /home/admin/Backup/Backup1376243097.tar

Я хотел бы использовать команду, подобную второй, но чтобы она возвращала только имена файлов без пути, моя работа сейчас заключается в использовании

read -r -a TarArray <<< `ls -1 /home/admin/Backup | grep "tar"`

но я надеюсь найти решение, которое не требует от меня подключения через grep.

Любые идеи? Спасибо всем!


person ms.Ashlee    schedule 11.08.2013    source источник


Ответы (4)


Вы могли бы потенциально использовать find для этого:

find /home/admin/Backup -name \*.tar -printf '%f\n'

Со страницы руководства:

-printf format
    True;  print  format  on  the standard output,
    interpreting `\' escapes and `%' directives.
    ...
    %f     File's name with any leading directories
           removed (only the last element).
person lmjohns3    schedule 11.08.2013

Итак, я знаю, что ответ уже выбран, но вот вариант использования ls на случай, если вам интересно:

ls /home/admin/Backup/*.tar | awk -F/ '{print $NF}'
person Bryan    schedule 11.08.2013

Запустите команду ls из каталога:

( cd /home/admin/Backup ; ls *.tar )

Но вам действительно не нужно использовать для этого команду ls. Оболочка уже расширяет для вас подстановочный знак *tar; все, что ls делает в этом случае, это печатает аргументы. Так:

( cd /home/admin/Backup ; echo *.tar )

(Кстати, ваша команда с grep "tar" выведет список всех файлов с "tar" где угодно в их именах, а не только файлы, имена которых заканчиваются на .tar. Если вы хотите использовать grep, вам нужно grep '\.tar$'.)

person Keith Thompson    schedule 11.08.2013

Вы не должны использовать для этого ls. Вместо этого просто создайте массив с полными именами:

files=(/path/to/dir/*.tar)

... и запускайте basename для каждого элемента при обработке массива.

person tripleee    schedule 11.08.2013
comment
Мне нравится ваше решение, но оно потребует переработки большого количества кода, но спасибо, в следующий раз, когда я буду делать что-то подобное, я буду помнить об этом. Спасибо! - person ms.Ashlee; 12.08.2013