Dile a `ls` que imprima solo el nombre de archivo base

21

Este es el comportamiento predeterminado de 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

¿Cómo hago para lsimprimir solo el nombre base? Me gusta:

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

Nota : Prefiero que el shell globbing use findcomo / net / nas / data / languages ​​/ pypm / sites / rex / free contiene una gran cantidad de archivos y directorios.

Srid dice reinstalar a Mónica
fuente
1
¿Prefieres el shell globing OVER usando find cuando el directorio contiene muchos archivos? ¿¿error de tipografía??
akira
1
Supongo que el OP no quiere una lista de subdirectorios y desconoce la opción de pasar -maxdepth 1a find.
intuido

Respuestas:

19

Si bien xargs -0está destinado a ser utilizado para la entrada delimitada por \ 0 (like find -print0), lsno tiene esa opción para delimitar su salida de esta manera.

Sin embargo,

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

haría el truco para convertir nuevas líneas en nulos en el camino. Esto permite que xargs trabaje con nombres que tengan espacios.

EDITAR: agregado -n 1a xargs

Steve Folly
fuente
Esto no funciona para mí: 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 ''
dice Reinstate Monica
@Sridhar: ¿podría necesitar el -n 1que sugirió en otro lugar como una opción xargs? (respuesta editada)
Steve Folly
Aunque personalmente prefiero mi propia respuesta (ya que casi nunca tengo que lidiar con espacios en los nombres de archivo), marcaré esto como la respuesta porque también maneja espacios.
Srid dice Reinstate Monica
Si la versión mac de xargs admite la -dopción (delimitador), puede hacerlo ls ... | xargs -d '\n' -n 1 basename.
intuido
12

Yo uso esto:

ls | tr '\n' '\n'

Da una lista como:

file1.mp3
file2.mp3
file3.mp3
...
arrayown
fuente
3
Esto es esencialmente lo mismo que ls -1(y el color está deshabilitado), como lo lsimplica cuando no se escribe en un terminal. Parece que te estás perdiendo el punto un poco, ya que el problema es quitar el nombre del directorio cuando se especifican lsargumentos de ruta usando comodines. Intenta ls -d "$PWD/"* | tr '\n' '\n'ver cuál es el problema real.
Daniel Beck
-1: no estoy seguro de por qué la gente sigue votando esta respuesta. No solo hace lo mismo ls -1, sino que tampoco funciona cuando se han usado globos, como señaló Daniel Beck.
slhck
-1 - Esto es lo mismo ls -1y solo funciona en el directorio actual, no con una ruta como ls path/*.
Brendan Byrd
5
ls -1 <path> | sed 's#.*/##'
mpez0
fuente
AH! ¡Finalmente algo que funciona con múltiples argumentos!
Aurélien Ooms
4

awk solución:

ls -1 /path/glob | awk -F'/' '{print $NF}'
Amnón
fuente
2

ls [ruta opcional] | xargs -0 nombre base

Glen Y.
fuente
2
-1: ls no puede delimitar nombres por \ 0, que es lo que xargs -0está buscando.
Steve Folly
1

Dijiste que prefieres pelear find, pero ¿sabías que los dos no son mutuamente excluyentes? Globbing ocurre en cualquier comando que ejecute, no solo ls. Por ejemplo:

$ 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

Tenga en cuenta que el ejemplo de búsqueda puede utilizar -print0, que es útil si sus rutas contienen espacios en blanco (las trsoluciones basadas en otras mencionadas funcionan muy bien en espacios normales, pero no en archivos que contienen líneas nuevas).

Por último, si tiene acceso a GNU find, también puede usar -printf que evita la llamada de nombre base por completo:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
Ryan Bright
fuente
Desafortunadamente, la -printfopción no está disponible en la versión de MacOSX de find.
Srid dice Reinstate Monica
Buena llamada; disculpas por la supervisión. He actualizado la respuesta.
Ryan Bright
-3

vaya al directorio donde tiene todos sus archivos y escriba.

find *.pypm
justicia
fuente
1
OP declaró explícitamente que no quiere usar find.
gronostaj
1
Además, esto ni siquiera hace lo que el OP necesita. (Nota: Debería usar find . -name '*pypm'si lo hace ... simplemente colocando el globo al lado para encontrar no logra nada, entonces podría escribir ls *.pypm.)
slhck