Скажите `ls` распечатать только базовое имя файла

21

Это поведение по умолчанию ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

Как сделать lsпечать только базовым именем? Подобно:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

Примечание : я предпочитаю глобализацию оболочки вместо использования, findпоскольку / net / nas / data / languages ​​/ pypm / sites / rex / free содержит огромное количество файлов и каталогов.

Срид говорит восстановить Монику
источник
1
вы предпочитаете оболочки оболочки над использованием поиска, когда каталог содержит много файлов? опечатка??
Акира
1
Я предполагаю, что OP не хочет перечислять подкаталоги и не знает о возможности перехода -maxdepth 1к find.
интуитивно

Ответы:

19

Хотя xargs -0он предназначен для использования для ввода, ограниченного \ 0 (подобно find -print0), lsне имеет такой возможности для ограничения вывода таким образом.

Тем не мение,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

сделал бы трюк для преобразования новых строк в нули по пути. Это тогда позволяет xargs работать с именами, которые имеют пробелы.

РЕДАКТИРОВАТЬ: добавлено -n 1в xargs

Стив Фолли
источник
Это не работает для меня: basename: extra operand \ 033 [0m / net / nas / data / languages ​​/ pypm / sites / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
Срид говорит восстановить Монику
@Sridhar: вам может понадобиться то, что -n 1вы предложили в другом месте, как вариант xargs? (ответ отредактирован)
Стив Фолли
Хотя я лично предпочитаю свой собственный ответ (поскольку мне почти никогда не приходится иметь дело с пробелами в именах файлов), я отмечу это как ответ, поскольку он также обрабатывает пробелы.
говорит Срид Восстановить Монику
Если версия xargs для Mac поддерживает опцию -d(разделитель), вы можете это сделать ls ... | xargs -d '\n' -n 1 basename.
интуитивно
12

Я использую это:

ls | tr '\n' '\n'

Это дает список как:

file1.mp3
file2.mp3
file3.mp3
...
arrayown
источник
3
По сути это то же самое, что и ls -1(и раскраска отключена), что lsподразумевает те, которые не записываются в терминал. Похоже, вы немного упускаете суть, поскольку проблема заключается в удалении имени dir swhen при указании lsаргументов пути с использованием подстановочных знаков . Попытайтесь ls -d "$PWD/"* | tr '\n' '\n'увидеть, что является фактической проблемой.
Даниэль Бек
-1 - не уверен, почему люди продолжают голосовать против этого ответа. Это не только делает то же самое ls -1, что и не работает, когда используются шарики, как указал Дэниел Бек.
Slhck
-1 - Это то же самое ls -1, что и работает только в текущем каталоге, а не с таким путем ls path/*.
Брендан Берд
5
ls -1 <path> | sed 's#.*/##'
mpez0
источник
AH! Наконец то, что работает с несколькими аргументами!
Орелиен Оомс
4

awk решение:

ls -1 /path/glob | awk -F'/' '{print $NF}'
Амнон
источник
2

ls [необязательный путь] | xargs -0 базовое имя

Глен Ю.
источник
2
-1: ls не может разделять имена на \ 0, что xargs -0и нужно.
Стив Фолли
1

Вы сказали, что предпочитаете болтаться find, но знаете ли вы, что оба не являются взаимоисключающими? Глобирование происходит по любой команде, которую вы запускаете, а не только ls. Например:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

Обратите внимание, что в примере поиска может использоваться -print0, что удобно, если ваши пути содержат пробелы ( trрешения, основанные на других, упомянутые в другом месте, прекрасно работают на обычных пробелах, но не на файлах, содержащих фактические символы новой строки).

Наконец, если у вас есть доступ к GNU find, вы также можете использовать -printf, который полностью исключает вызов basename:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
Райан Брайт
источник
К сожалению, -printfопция недоступна в MacOSX версии find.
говорит Срид Восстановить Монику
Хороший звонок; извинения за недосмотр. Я обновил ответ.
Райан Брайт
-3

перейдите в каталог, где у вас есть все ваши файлы и введите.

find *.pypm
справедливость
источник
1
ОП явно заявил, что он не хочет использовать find.
Гроностай
1
Кроме того, это даже не делает то, что нужно ОП. (Примечание: вы должны использовать find . -name '*pypm'если вообще ... просто поместив шарик рядом, чтобы найти ничего не достигает - тогда вы могли бы просто написать ls *.pypm.)
slhck