Tengo dos preguntas. Primero, ¿qué comando enumera los archivos y directorios, pero primero los directorios?
Segunda pregunta: quiero copiar una lista de archivos en un solo directorio, pero convertir el directorio de destino en el primer nombre de archivo en el comando.
command-line
shell-script
ls
Elham abbasi
fuente
fuente
ls
Tiene un--group-directories-first
interruptor.-t
es posiblemente una opción solo de GNUcp
que toma un directorio objetivo explícito y, por lo tanto, puede ir a cualquier parte de la línea de comando, incluido el comienzo.Respuestas:
¿Tienes GNU?
La versión gnu de
ls
has--group-directories-first
. Ycp
tiene-t
.No GNU?
En los sistemas que no tienen GNU
ls
, su mejor opción es dos llamadas sucesivasfind
con-maxdepth n
/-mindepth n
y-type t
con las opciones apropiadas.Para copiar archivos, con el objetivo primero, tendría que escribir un script que guarde el primer argumento, luego use
shift
y agregue el argumento hasta el final.¡Cuidado!
Si planeaba usarlos juntos, es decir, recopilar la lista de (
find
ols
posiblemente mediante el usoxargs
) y pasarla acp
(o uncp
contenedor), debe tener en cuenta los peligros que conlleva analizar las listas de archivos (básicamente, los nombres de archivo pueden contienen caracteres como líneas nuevas que pueden estropear su guión). Específicamente, mira enfind
's-exec
y-print0
opciones yxargs
' s-0
opción.Una herramienta alternativa para copiar eficientemente árboles de directorios.
Es posible que desee considerar el uso en su
rsync
lugar; Tiene muchas funciones que pueden facilitar su trabajo.fuente
--group-directories-first
).ls --version
para averiguar cuál tienes.Listado de directorios primero para un no GNU
ls
:ls -l | sort
Tenga en cuenta que esto también enumerará todo el montón de otras cosas raras como enlaces simbólicos, tomas de corriente y tuberías (agrupadas adecuadamente, por supuesto), pero teniendo en cuenta que esas cosas son bastante raras, eso no debería ser un problema. De lo contrario, el filtro sería
ls -l | grep '^(-|d)' | sort
fuente
sort -r
.funciona para bash y zsh
simplemente agregue alias en ~ / .bashrc o ~ / .zshrc
Además, si tiene ZSH, puede usar la utilidad "k"
simplemente instálelo con antígeno, colocando lo siguiente en ~ / .zshrc
fuente
Para
zsh
las listas de finalización, puede establecer ellist-dirs-first
estilotrue
para que los directorios se muestren primero. En su~/.zshrc
:(aquí se aplica a todos los widgets de finalización que lo admiten y para todos los comandos; puede restringir eso si lo desea, consulte la
zstyle
documentación para más detalles)Si aún no lo ha hecho, asegúrese de ejecutar
compinstall
también para obtener listas de finalización en color, con descripciones, etc. y todas las demás ventajas.fuente
Para no GNU, awk puede filtrar todos los demás campos:
ls -l
must contiene 9 camposEl resultado se ve
ls -1
pero con los directorios puestos primero:De acuerdo con "El formato largo" de la página de manual de ls, cuando se involucran otros tipos de archivos, el orden de salida debe ser:
Una práctica función bash (ponla en tu .bash_profile o .bashrc):
fuente