¿Cómo hago para hacer eco solo del nombre de archivo de un archivo si itero un directorio con un bucle for?
for filename in /home/user/*
do
echo $filename
done;
extraerá la ruta completa con el nombre del archivo. Solo quiero el nombre del archivo.

${file##*/}a"${file##*/}"para admitir nombres de archivo con espacios, por ejemplo, "Mi nombre de archivo con espacios.txt".Solo usa
basename:Las comillas son necesarias en caso de que $ filename contenga, por ejemplo, espacios.
fuente
$()como lo hizo Oli/test 1,basename $(pwd)salida:test. Probado en OS X y Ubuntu Server (14.04). La solución nativa de bash, como lo recomendó @SiegeX, es lo que funcionó para mí.basename "$(pwd)"lugar.$PWDlugar de ejecutar el comando.Utilizar
basename:fuente
echo?basenameya imprime los resultados.echoincluso puede alterar el resultado si no cita la subcapa. Ejemplo:echo $(basename path/with\ \ spaces)imprime incorrectamentewith spaces(solo un espacio).Otro enfoque es utilizarlo
lsal leer la lista de archivos dentro de un directorio para darle lo que desea, es decir, "solo el nombre del archivo". A diferencia de leer la ruta completa del archivo y luego extraer el componente "nombre de archivo" en el cuerpo del bucle for.Ejemplo a continuación que sigue a su original:
Si está ejecutando el script en el mismo directorio que los archivos, simplemente se convierte en:
fuente
lsincluye cualquier archivo de puntos donde la*expansión normalmente no lo hace. Tambiénfor f in $(...) ...falla si algún nombre de archivo contiene espacios en blanco a menos que establezca IFS, puede fallar si algún nombre de archivo contiene un carácter glob a menos que establezca -f / -o noglob, y dependiendo del sistema o shellechopuede fallar si algún nombre de archivo es guión + letra o contiene barra invertida. OTOHls -1 /path/to/dirpor sí solo imprime de manera confiable cada nombre de archivo en una línea, módulo la diferencia de dotfiles.si solo desea el nombre de archivo:
para obtener más información sobre el
cutcomando, consulte aquí .fuente