Як спочатку перелічити файли та каталоги з каталогами


22

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

Друге питання: Я хочу скопіювати список файлів в єдиний каталог, але зробити цільовий каталог першим іменем файлу в команді.


5
lsмає --group-directories-firstвимикач.
jasonwryan

1
-tможливо, це лише параметр GNU, cpякий займає явний цільовий каталог, і, отже, він може перейти будь-де в командному рядку, включаючи початок.
jw013

Відповіді:


36

Отримав GNU?

Версія gnu lsмає --group-directories-first. І cpмає -t.

Ні 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' s -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
лс -л | сортування не працювало для мене на Mac. Спочатку вона групує каталоги, але вона їх не сортувала, не сортувала наступні назви файлів.
Рей

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

5

працює для 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
приємна відповідь запропонувати псевдонім.
рüффп

1

Для не-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 man, коли інші типи файлів залучаються, порядок виводу має бути таким:

   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 } }'
}

0

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

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

(тут застосовано до всіх віджетів завершення, які підтримують його та для всіх команд; ви можете обмежити це, якщо вам подобається, zstyleдетальну інформацію див. у документації)

Якщо ви цього ще не зробили, переконайтеся, що ви також запустили compinstall, щоб отримати кольорові списки завершень, описи тощо та всі інші смаколики.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.