Скажите `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
...

3
По сути это то же самое, что и ls -1(и раскраска отключена), что lsподразумевает те, которые не записываются в терминал. Похоже, вы немного упускаете суть, поскольку проблема заключается в удалении имени dir swhen при указании lsаргументов пути с использованием подстановочных знаков . Попытайтесь ls -d "$PWD/"* | tr '\n' '\n'увидеть, что является фактической проблемой.
Даниэль Бек

-1 - не уверен, почему люди продолжают голосовать против этого ответа. Это не только делает то же самое ls -1, что и не работает, когда используются шарики, как указал Дэниел Бек.
Slhck

-1 - Это то же самое ls -1, что и работает только в текущем каталоге, а не с таким путем ls path/*.
Брендан Берд





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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.