Скажіть `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
ви віддаєте перевагу глобальній оболонці OVER, використовуючи функцію find, коли каталог містить багато файлів? помилка ??
акіра

1
Я здогадуюсь, що ОП не хоче перелічити підкаталоги, і не знає про можливість переходу -maxdepth 1до find.
інтуїтивно

Відповіді:


19

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

Однак,

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

зробив би трюк, щоб перетворити нові рядки в нулі по дорозі. Це дозволяє xargs працювати з іменами, які мають пробіли.

EDIT: додано -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? (відповідь відредаговано)
Стів Фоллі

Хоча я особисто віддаю перевагу своїй власній відповіді (оскільки мені майже ніколи не доводиться мати справу з пробілами у назви файлів), я позначу це як відповідь, коли вона також обробляє пробіли.
Шрід каже, що повернеться до Моніки

Якщо версія mac xargs підтримує параметр -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, ви також можете використовувати -printf, який взагалі уникає виклику базового імені:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

На жаль, -printfопція недоступна у версії MacOSX find.
Шрід каже, що повернеться до Моніки

Хороший дзвінок; вибачення за недогляд. Я оновив відповідь.
Райан Яскравий

-3

перейдіть до каталогу, де ви маєте всі файли та введіть.

find *.pypm

1
ОП прямо заявив, що не хоче користуватися find.
gronostaj

1
Крім того, це навіть не робить те, що потрібно ОП. (Примітка. Ви повинні використовувати, find . -name '*pypm'якщо взагалі… просто поставивши глобус поруч, щоб знайти нічого не досягає - тоді ви можете просто написати ls *.pypm.)
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.