Как вывести список файлов и каталогов с каталогами в первую очередь


22

У меня два вопроса. Во-первых, какая команда перечисляет файлы и каталоги, но сначала перечисляет каталоги?

Второй вопрос: я хочу скопировать список файлов в один каталог, но сделать целевой каталог первым именем файла в команде.


5
lsимеет --group-directories-firstпереключатель
Джейсонвриан

1
-tэто, возможно, опция только для GNU, cpкоторая принимает явный целевой каталог и, следовательно, может находиться в любом месте командной строки, включая начало.
jw013

Ответы:


36

Есть GNU?

Гну версия lsимеет --group-directories-first. И cpимеет -t.

Нет GNU?

В системах, в которых нет gnu ls, лучше всего делать два последовательных вызова findс -maxdepth n/ -mindepth nи -type tс соответствующими параметрами.

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

Для копирования файлов, сначала с целью, вам нужно написать скрипт, который сохраняет первый аргумент, затем использует shiftи добавляет аргумент в конец.

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

Осторожно!

Если вы планируете использовать их вместе - то есть собирать список из findили ls(возможно, используя xargs) и передавать его cp(или cpоболочку), вы должны знать о том, какие опасности лежат в разборе списков файлов (в основном, имена файлов могут содержит символы, такие как переводы строк, которые могут испортить ваш сценарий). В частности, посмотрите на find's -execи -print0варианты и xargs' -0вариант.

Альтернативный инструмент для эффективного копирования деревьев каталогов.

Вы можете захотеть использовать rsyncвместо этого; он имеет множество функций, которые могут облегчить вашу работу.


Это здорово. В целом, есть ли способ узнать, есть ли у меня версия GNU? (кроме попытки выбора --group-directories-first).
Амелио Васкес-Рейна

3
Вы можете бежать, ls --versionчтобы узнать, какой у вас есть.
Шон Дж. Гофф

6

Сначала перечислите каталоги для не-GNU ls:

ls -l | sort

Обратите внимание, что здесь будут перечислены все другие странные вещи, такие как символические ссылки, сокеты и каналы (естественно, сгруппированные, конечно), но, учитывая, что это довольно редко, это не должно быть проблемой. В противном случае фильтр будетls -l | grep '^(-|d)' | sort


1
+1 умнее и короче принятого ответа. За исключением того, что это действительно должно быть sort -r.
PythonNut

1
ls -l | сортировка не работает для меня на Mac. Сначала он группирует каталоги, но не сортирует их и не сортирует последующие имена файлов.
Рэй

также обратите внимание: используя `| sort` удалит ваш цвет, как сейчас текст.
JayRizzo

4

работает для bash и zsh

просто добавьте псевдоним в ~ / .bashrc или ~ / .zshrc

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

Также, если у вас есть ZSH, вы можете использовать утилиту "k"

k -h --group-directories-first

введите описание изображения здесь

просто установите его с антигеном, поместив следующее в ~ / .zshrc

antigen bundle reduxionist/k --branch=add-sort-options

1
хороший ответ, чтобы предложить псевдоним.
рüффп

0

Для zshсписков завершения вы можете установить list-dirs-firstстиль trueдля каталогов, которые будут отображаться первыми. В вашем ~/.zshrc:

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

(здесь применяется ко всем виджетам завершения, которые его поддерживают, и ко всем командам; вы можете ограничить это, если хотите, см. zstyleдокументацию)

Если вы еще этого не сделали, запустите compinstallтакже, чтобы получить цветные списки завершения, с описаниями и т. Д., А также со всеми другими вкусностями.


0

Для не-GNU awk может фильтровать все остальные поля:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: вывод ls -lдолжен содержать 9 полей
  • если строка начинается с 'd', печатает дополнительный '/'
  • в противном случае просто имя файла

Вывод выглядит так, ls -1но каталоги ставятся первыми:

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

Согласно «Длинному формату» справочной страницы ls, когда задействованы другие типы файлов, порядок вывода должен быть:

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

Удобная функция bash (поместите ее в ваш .bash_profile или .bashrc):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.