Tôi muốn sử dụng ls
lệnh để hiển thị thư mục đầu tiên và sau đó các tập tin. Tôi đã thử:
ls -la | sort -k 1
Nhưng tôi đã nhận một đơn đặt hàng sai.
ls -lh --group-directories-first
Tôi muốn sử dụng ls
lệnh để hiển thị thư mục đầu tiên và sau đó các tập tin. Tôi đã thử:
ls -la | sort -k 1
Nhưng tôi đã nhận một đơn đặt hàng sai.
ls -lh --group-directories-first
Câu trả lời:
Lệnh sau sẽ liệt kê các thư mục đầu tiên, các tệp thông thường thứ hai và liên kết thứ ba.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Ngoài ra, sẽ rất có ý nghĩa khi tạo một bí danh cho lệnh này để lưu tổ hợp phím.
Biên tập:
Nếu bạn muốn thư mục đầu tiên, và sau đó mọi thứ không phải là thư mục thứ hai, hãy sử dụng:
ls -la | grep "^d" && ls -la | grep -v "^d"
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
?
alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(trích dẫn không bắt buộc và được thay thế &&
bằng ;
). Một lựa chọn khác là giới thiệu một biến và sau đó đánh giá nó : a="ls -la|grep ^d";eval $a;eval $a -v
. Có thể hữu ích để tránh lặp lại khi nhiều tùy chọn được chỉ định cho ls
/ grep
. Ngoài ra còn có ls -la --group-directories-first
tùy chọn đó , tuy nhiên imo ngắn nhất làls -la|sort
Tôi rất thích * nix và thích nhìn thấy sự sáng tạo đi vào một số câu trả lời này ...
Của tôi gần như không được ưa thích trên GNU Linux:
alias ls='ls --color -h --group-directories-first'
Cho rằng tôi thấy thoải mái hơn với các ứng dụng CLI linux của mình, tôi cũng có xu hướng cập nhật coreutils trên OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
điều này! :)
Đối với người dùng Mac coreutils :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
Giả sử hệ thống của bạn đã sẵn sàng để homebrew :
gls
hơn. Đúng?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
Có một số điều tôi muốn thấy trong danh sách thư mục và cho đến nay không có câu trả lời nào ở đây đáp ứng tất cả các yêu cầu dưới đây. Yêu cầu của tôi cho một danh sách thư mục:
./
và ../
), tệp và liên kết--group-directories-first
không hoạt động trong Git Bash cho WindowsSau nhiều lần hack, cuối cùng tôi cũng tìm ra được một lớp lót (mặc dù một hàng rất dài ;-)) mà tôi hài lòng. Tôi đã gán cái này cho một bí danh có tên 'dir':
ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" |
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" |
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . |
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)
Để làm cho mọi thứ dễ quản lý hơn, tôi đã đưa ra các lệnh riêng biệt để xuất từng phân đoạn của danh sách thư mục theo ý thích của tôi, sau đó lắp ráp chúng lại với nhau bằng &&
toán tử.
ls -dlF --color * .* | head -n2
- Trích xuất ./
và ../
. Chúng tôi không muốn thông qua những điều này sort
vì chúng đã được sắp xếp theo đúng thứ tự và việc sắp xếp chúng có thể dẫn đến ../
việc được liệt kê đầu tiên. Các -d
tùy chọn là để thoát khỏi các "tổng" đường; Tôi muốn thêm -F
để hiển thị dấu gạch chéo cho các thư mục (nó cũng sẽ đánh dấu các liên kết tượng trưng bằng "@" khi bạn thực hiện đơn giản ls -F
).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Trích xuất các thư mục và sắp xếp chúng theo tên tệp (cột thứ 9), bỏ qua cả ký tự không phải alpha / dấu cách ( d
tùy chọn) và trường hợp ký tự ( f
tùy chọn). Các ls -A
không bao gồm tùy chọn ./
và ../
từ việc niêm yết kể từ khi chúng ta đã chiết xuất chúng trong bước trước. Tôi có xu hướng tiền tố tất cả grep
và sort
các lệnh với LC_ALL=C
thiết lập lại miền địa phương để (1) đầu ra nhất quán trên các vỏ Unix và (2) đôi khi bạn có thể thấy hiệu suất nhanh hơn vì nó không còn có chi tiết của ký tự UTF-8 nặng được đặt thành đôi pho vơi.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Điều này tương tự như bước trên, nhưng lần này chúng tôi đang sắp xếp các tệp và liên kết tượng trưng.
find -maxdepth 1 -type d ! -name . | wc -l
- Lấy số lượng thư mục, không bao gồm ./
và ../
.
find -maxdepth 1 -type f | wc -l
- Lấy số lượng tập tin.
find -maxdepth 1 -type l | wc -l
- Lấy số lượng liên kết tượng trưng.
du -hs | cut -f 1
- Trích xuất tổng kích thước của tất cả các thư mục con ở định dạng có thể đọc được.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Trích xuất tổng kích thước của tất cả các tệp ở định dạng có thể đọc được.
Hãy xem dir
bí danh mới của chúng tôi trong hành động!
TRƯỚC:
$ ls -alF
total 22
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
SAU:
$ dir
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
5 Dir(s) 2.8M 6 File(s) 31K 0 Link(s)
Một nhược điểm nhỏ là bạn không thể có danh sách màu, vì các ký tự điều khiển màu xung quanh tên tệp khiến việc sắp xếp quá không đáng tin cậy.
CẬP NHẬT
Bí danh ở trên rất chậm khi được thực thi từ thư mục gốc của hệ thống tệp sâu, vì vậy tôi đã cập nhật lên lệnh đơn giản hơn nhưng hiệu quả hơn nhiều này:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Đầu ra mẫu:
$ dir
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom 0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom 0 Jun 16 2016 temp/
drwxr-xr-x 1 Tom 0 Jul 13 2016 vimfiles/
-rw-r--r-- 2 Tom 365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom 2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom 2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom 1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom 8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom 2444 Jul 13 2016 _vimrc
33819 bytes
Vì phiên bản mới của Git Bash cho Windows hỗ trợ --group-directories-first
, chúng tôi không còn phải quay lại sort
. Mặc dù bí danh mới không hiển thị nhiều thông tin như bí danh trước đó, nhưng hiệu suất đạt được sẽ cao hơn giá trị của nó. Như một kỹ năng, bạn cũng có được màu sắc!
Bạn đã có một số lựa chọn, tùy thuộc vào việc bạn muốn giữ thứ tự bảng chữ cái.
Bạn chỉ có thể thử:
ls -al | sắp xếp -k1 -r
hoặc này, để giữ thứ tự chữ cái cho các tệp có cùng quyền:
ls -al | sắp xếp -k1,1 -k9,9 -r
hoặc, như eleven81 đã nói (nhưng phiên bản này liệt kê mọi thứ):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"
ls- al|sort -k1 -r
làm việc. Những gì còn thiếu chỉ là -r
cờ.
./
và ../
sẽ không phải là hai dòng đầu tiên, theo thứ tự đó. Ngoài ra, tôi đồng ý rằng đó là giải pháp hiệu quả hơn.
Để trả lời câu hỏi của delerious010 , tôi sẽ thêm rằng nếu bạn muốn đặt hàng kiểu cũ:
LANG=C ls -la --group-directories-first
(hoặc sử dụng LC_ALL hoặc LANGUAGE hoặc LC_COLLATE được đặt thành "C").
Điều này sẽ cung cấp một cái gì đó tương tự như:
.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Mặc dù, nếu tôi nhớ lại một cách chính xác, các tệp chấm ẩn ban đầu xuất hiện trước các thư mục.
Đây là một chức năng để làm điều này (bash hoặc zsh): Và ... Tôi không cho rằng đây là cách tốt nhất, nhưng đó là cách tôi nghĩ ra và đang sử dụng ngay bây giờ:
chức năng lss { # Hiển thị danh sách thư mục với các thư mục ở trên cùng. lệnh ls --color = luôn $ @ | egrep '^ d | tổng' lệnh ls --color = luôn $ @ | egrep -v '^ d | tổng'; }
ls -l
) để lọc theo loại tệp như thế. Ngoài ra, lệnh này sẽ phá vỡ trên khoảng trắng (trong bash). Bạn cần trích dẫn như vậy: "$@"
Nếu bạn muốn sử dụng phương pháp này, bạn có thể làm một cái gì đó tương tự:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
sẽ hiển thị cho bạn các thư mục đầu tiên theo thứ tự bảng chữ cái, nhưng sẽ làm hỏng danh sách tập tin.
Tùy chọn dài:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Cách khác ...
find . -d 1 -type d | ls -la | sort -r
HOẶC LÀ
ls -la | sort -r
HOẶC LÀ
d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"
alias ls='ls -lhF --color'
list_sorted() {
ls $* | grep "^d";
ls $* | grep "^-";
ls $* | grep -v -E "^d|^-|^total"
}
alias ll=list_sorted
Tôi sử dụng kết hợp các giải pháp được cung cấp trong các câu trả lời và ý kiến ở đây.
ls
Trước hết, tôi ghi đè hành vi mặc định cho ls
:
-l
: Luôn hiển thị danh sách dưới dạng danh sách một chiều, dọc-h
: Hiển thị kích thước tệp theo kiểu người có thể đọc được (ví dụ: 4.0K thay vì 4096)-F
: Hiển thị các chỉ số như dấu gạch chéo cho thư mụcalias ls='ls -lhF --color'
ll
Tiếp theo, tôi viết một hàm chứa logic sắp xếp. Đối với mỗi ls
tôi vượt qua bất kỳ đối số ban đầu thông qua nó. Điều đó cho phép tôi sử dụng bí danh từ một thư mục làm việc khác với thư mục tôi muốn liệt kê (tức là ls -a ~
).
Ngoài ra, mỗi cuộc gọi đến ls
được dẫn đến một grep
lệnh. Ở đây, việc phân loại xảy ra. ls -l | grep "^d"
ví dụ chỉ liệt kê các thư mục. Nếu các thư mục nên được liệt kê đầu tiên, điều này cũng cần phải đến đầu tiên trong chức năng. Điều tiếp theo là các tập tin.
Cuối cùng, tôi hiển thị tất cả mọi thứ không phải là thư mục cũng không phải là tệp (cũng không phải là dòng hiển thị tổng kích thước của nội dung thư mục). Điều này được thực hiện bằng cách ghép trực tiếp, các mục nhập tệp thông thường và tổng số mục nhập và sau đó đảo ngược kết quả thông qua -v
đối số.
list_sorted() {
# List directories
ls $* | grep "^d";
# List regular files
ls $* | grep "^-";
# List everything else (e.g. symbolic links)
ls $* | grep -v -E "^d|^-|^total"
}
Cuối cùng, tôi đặt bí danh cho một lệnh mới. Đặc biệt tôi không muốn ghi đè ls
trong trường hợp chức năng của tôi bị hỏng trong một số tình huống. Sau đó tôi muốn có thể sử dụng ls
. Ngoài ra, bạn luôn có thể gọi lệnh không có bí danh ls
bằng cách gọi \ls
.
alias ll=list_sorted
;
thay vì &&
như một dấu phân cách cho các lệnh. Mặt khác, người ta không thể liệt kê nội dung của các thư mục không chứa các thư mục (lệnh ls đầu tiên ước tính thành false, do đó không cho phép thực thi lệnh tiếp theo vì nó được kết hợp với &&
. ;
Tránh điều đó.)Đây là một giải pháp kịch bản. Chỉ liệt kê tên, không có dữ liệu inode, bảng chữ cái, không phân biệt chữ hoa chữ thường, được định dạng thành các cột. Mặc dù nó là hàng chính thay vì cột chính như đầu ra mặc định của ls. Các cột sẽ hơi lộn xộn nếu có tên tệp có> 26 ký tự.
rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
Và một số khác, với một số định dạng bổ sung.
rm -f /tmp/lsout
echo " ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
rm -f /tmp/lsout
echo " ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
Đầu ra cho cái cuối cùng trông giống như sau, trừ các màu:
---- Directories ---- archive/ bookmarks/
Desktop/ Documents/ Downloads/
fff/ health/ Library/
Movies/ Music/ Pictures/
Public/ rrf/ scifi/
testdir/ testdir2/
------- Files ------- @todo comedy
delme lll maxims
schedule vtokens style
Chỉ cần nhớ không bí danh hoặc thay đổi hành vi mặc định của ls vì tập lệnh này gọi nó.
-
trước đâyd
khi sử dụngsort