Làm thế nào để liệt kê các tập tin và thư mục với các thư mục đầu tiên


22

Tôi có hai câu hỏi. Đầu tiên, lệnh nào liệt kê các tệp và thư mục, nhưng liệt kê các thư mục trước?

Câu hỏi thứ hai: Tôi muốn sao chép danh sách các tệp vào một thư mục, nhưng đặt thư mục đích thành tên tệp đầu tiên trong lệnh.


5
ls--group-directories-firstcông tắc.
jasonwryan

1
-tcó thể là một tùy chọn chỉ dành cho GNU để cpcó một thư mục đích rõ ràng và do đó có thể đi bất cứ nơi nào trong dòng lệnh, bao gồm cả phần đầu.
jw013

Câu trả lời:


36

Có GNU không?

Phiên bản gnu của ls--group-directories-first. Và cp-t.

Không có GNU?

Trên các hệ thống không có gnu's ls, đặt cược tốt nhất của bạn là hai cuộc gọi liên tiếp đến findvới -maxdepth n/ -mindepth n-type tvới các tùy chọn phù hợp.

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

Để sao chép tệp, với mục tiêu trước tiên, bạn sẽ phải viết một tập lệnh lưu đối số đầu tiên, sau đó sử dụng shiftvà nối thêm đối số vào cuối.

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

Xem ra!

Nếu bạn đang dự định sử dụng chúng cùng nhau - nghĩa là thu thập danh sách từ findhoặc ls(có thể bằng cách sử dụng xargs) và chuyển nó đến cp(hoặc cptrình bao bọc), bạn nên biết những nguy hiểm nằm trong danh sách phân tích tệp (về cơ bản, tên tệp có thể chứa các ký tự như dòng mới có thể làm rối kịch bản của bạn). Cụ thể, nhìn vào find's -exec-print0tùy chọn và xargs' s -0lựa chọn.

Một công cụ thay thế để sao chép hiệu quả cây thư mục.

Bạn có thể muốn xem xét sử dụng rsyncthay thế; nó có rất nhiều chức năng có thể làm cho công việc của bạn dễ dàng hơn.


Điều đó thật tuyệt. Tổng quát hơn, có cách nào để biết tôi có phiên bản GNU không? (ngoài việc thử tùy chọn --group-directories-first).
Amelio Vazquez-Reina

3
Bạn có thể chạy ls --versionđể tìm ra cái nào bạn có.
Shawn J. Goff

6

Danh sách thư mục đầu tiên cho một non-GNU ls:

ls -l | sort

Lưu ý, điều này sẽ liệt kê tất cả các thứ kỳ lạ khác như symlink, socket và pipe (dĩ nhiên được nhóm lại), nhưng xem xét những thứ đó khá hiếm nên không phải là vấn đề. Nếu không thì bộ lọc sẽ làls -l | grep '^(-|d)' | sort


1
+1 thông minh và ngắn hơn câu trả lời được chấp nhận. Ngoại trừ việc nó thực sự nên được sort -r.
PythonNut

1
ls -l | sắp xếp không làm việc cho tôi trên máy Mac. Nó nhóm các thư mục trước nhưng nó không sắp xếp chúng và cũng không sắp xếp tên tệp theo sau.
Ray

cũng lưu ý: sử dụng `| sort` sẽ loại bỏ màu của bạn như bây giờ là văn bản.
JayRizzo

4

hoạt động cho bashzsh

chỉ cần thêm bí danh trong ~ / .bashrc hoặc ~ / .zshrc

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

Ngoài ra nếu bạn có ZSH, bạn có thể sử dụng tiện ích "k"

k -h --group-directories-first

nhập mô tả hình ảnh ở đây

chỉ cần cài đặt nó với kháng nguyên, bằng cách đặt đoạn mã sau vào ~ / .zshrc

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

1
câu trả lời tốt đẹp để cung cấp bí danh.
hôm nay

0

Đối với zshdanh sách hoàn thành, bạn có thể đặt list-dirs-firstkiểu truecho các thư mục được hiển thị đầu tiên. Trong của bạn ~/.zshrc:

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

(ở đây áp dụng cho tất cả các tiện ích hoàn thành hỗ trợ nó và cho tất cả các lệnh; bạn có thể hạn chế nếu bạn muốn, xem zstyletài liệu để biết chi tiết)

Nếu bạn chưa làm như vậy, hãy đảm bảo chạy compinstalltốt để có được danh sách hoàn thành bằng màu sắc, với các mô tả, vv và tất cả các tính năng khác.


0

Đối với non-GNU, awk có thể lọc tất cả các trường khác:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: đầu ra của ls -lphải chứa 9 trường
  • nếu dòng bắt đầu bằng 'd', hãy in thêm '/'
  • mặt khác chỉ là tên tập tin

Đầu ra trông giống như ls -1nhưng với các thư mục được đặt lên hàng đầu:

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

Theo "Định dạng dài" của trang ls man, khi các loại tệp khác tham gia, thứ tự đầu ra phải là:

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

Hàm bash tiện dụng (đặt nó trong .bash_profile hoặc .bashrc):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.