Como listar arquivos e diretórios com diretórios primeiro

22

Eu tenho duas perguntas. Primeiro, qual comando lista arquivos e diretórios, mas lista os diretórios primeiro?

Segunda pergunta: quero copiar uma lista de arquivos em um único diretório, mas torne o diretório de destino o primeiro nome do arquivo no comando.

Elham abbasi
fonte
5
lstem um --group-directories-firstinterruptor.
jasonwryan
1
-té possivelmente uma opção apenas GNU, cpque requer um diretório de destino explícito e, portanto, pode ir a qualquer lugar na linha de comando, incluindo o início.
jw013

Respostas:

36

GNU obtido?

A versão gnu do lshas --group-directories-first. E cptem -t.

No GNU?

Em sistemas que não têm gnu é ls, sua melhor aposta é duas chamadas sucessivas para findcom -maxdepth n/ -mindepth ne -type tcom as opções apropriadas.

find . -maxdepth 1 -mindepth 1 -type d
find . -maxdepth 1 -mindepth 1 \! -type d

Para copiar arquivos, com o destino primeiro, você teria que escrever um script que salve o primeiro argumento, depois use shifte inclua o argumento no final.

#!/bin/sh
target="$1"
shift
cp -r -- "$@" "$target"

Cuidado!

Se você estava planejando usá-los juntos - ou seja, coletando a lista de ( findou lspossivelmente usando xargs) e passando-a para cp(ou um cpwrapper), você deve estar ciente de quais perigos existem na análise de listas de arquivos (basicamente, os nomes de arquivos podem conter caracteres como novas linhas que podem atrapalhar seu script). Especificamente, olhar em find's -exece -print0opções e xargs' s -0opção.

Uma ferramenta alternativa para copiar com eficiência as árvores de diretórios.

Você pode querer usar o uso rsync; possui muitas funcionalidades que podem facilitar seu trabalho.

Shawn J. Goff
fonte
Isso é ótimo. De maneira mais geral, existe alguma maneira de saber se eu tenho a versão GNU? (além de tentar a opção --group-directories-first).
Amelio Vazquez-Reina
3
Você pode correr ls --versionpara descobrir qual deles possui.
Shawn J. Goff
6

Listando diretórios primeiro para um não-GNU ls:

ls -l | sort

Observe que isso listará todo o resto de outras coisas estranhas, como links simbólicos, soquetes e tubos (agrupados adequadamente, é claro), mas considerando que essas coisas são bastante raras, não devem ser um problema. Caso contrário, o filtro serials -l | grep '^(-|d)' | sort

Alexander Shcheblikin
fonte
1
+1 inteligente e mais curto que a resposta aceita. Exceto que realmente deveria ser sort -r.
precisa saber é o seguinte
1
ls -l | tipo não funcionou para mim em um Mac. Ele agrupa os diretórios primeiro, mas não os classificou nem os nomes de arquivos que se seguiram.
Ray
Observe também: usando o `| sort` removerá sua cor como agora é o texto.
21418 JayRizzo # 05:
4

funciona para bash e zsh

basta adicionar o alias em ~ / .bashrc ou ~ / .zshrc

# Colorize the ls output ##
alias ls='LC_COLLATE=C ls -h --group-directories-first --color=auto'

Além disso, se você possui o ZSH, pode usar o utilitário "k"

k -h --group-directories-first

insira a descrição da imagem aqui

basta instalá-lo com antígeno, colocando o seguinte em ~ / .zshrc

antigen bundle reduxionist/k --branch=add-sort-options
DmitrySemenov
fonte
1
boa resposta para oferecer o alias.
25418
0

Para zshlistagens de conclusão, você pode definir o list-dirs-firstestilo truepara os diretórios a serem mostrados primeiro. No seu ~/.zshrc:

zstyle ':completion:*' list-dirs-first true

(aqui aplicado a todos os widgets de conclusão que o suportam e a todos os comandos; você pode restringir que, se quiser, consulte a zstyledocumentação para obter detalhes)

Se você ainda não o fez, certifique-se de executar compinstalltambém para obter listas de conclusão em cores, com descrições, etc. e todos os outros itens.

Stéphane Chazelas
fonte
0

Para não-GNU, o awk pode filtrar todos os outros campos:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: a saída de ls -l must contém 9 campos
  • se a linha começar com 'd', imprime um '/' extra
  • caso contrário, apenas o nome do arquivo

A saída parece, ls -1mas com os diretórios colocados em primeiro lugar:

node_modules/
src/
e2e/
angular.json
tslint.json
package.json
README.md

De acordo com "O formato longo" da página do manual ls, quando outros tipos de arquivos são envolvidos, a ordem de saída deve ser:

   s     Socket link.
   p     FIFO.
   l     Symbolic link.
   d     Directory.
   c     Character special file.
   b     Block special file.
   -     Regular file.

Uma útil função bash (coloque-a no seu .bash_profile ou .bashrc):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
clarkttfu
fonte