วิธีแสดงรายการไฟล์และไดเรกทอรีด้วยไดเรกทอรีก่อน


22

ฉันมีสองคำถาม ก่อนคำสั่งใดรายการไฟล์และไดเรกทอรี แต่รายการไดเรกทอรีก่อน?

คำถามที่สอง: ฉันต้องการคัดลอกรายการไฟล์ไปยังไดเรกทอรีเดียว แต่ทำให้ไดเรกทอรีเป้าหมายเป็นชื่อไฟล์แรกในคำสั่ง


5
lsมี--group-directories-firstสวิตช์
jasonwryan

1
-tอาจเป็นตัวเลือกเดียวของ GNU cpที่ใช้ไดเรกทอรีเป้าหมายที่ชัดเจนและด้วยเหตุนี้สามารถไปที่ใดก็ได้ในบรรทัดคำสั่งรวมถึงจุดเริ่มต้น
jw013

คำตอบ:


36

เตรียมพร้อม GNU ไหม

รุ่น 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' s -0ตัวเลือก

เครื่องมือทางเลือกสำหรับการคัดลอกแผนผังไดเรกทอรีอย่างมีประสิทธิภาพ

คุณอาจต้องการใช้rsyncแทน มันมีฟังก์ชั่นมากมายที่อาจทำให้งานของคุณง่ายขึ้น


มันเยี่ยมมาก โดยทั่วไปแล้วมีวิธีใดที่จะทราบว่าฉันมีรุ่น GNU หรือไม่ (นอกเหนือจากการลองใช้ตัวเลือก--group-directories-first)
Amelio Vazquez-Reina

3
คุณสามารถเรียกใช้ls --versionเพื่อค้นหาสิ่งที่คุณมี
Shawn J. Goff

6

รายการไดเรกทอรีแรกสำหรับผู้ที่ไม่ใช่ GNU ls:

ls -l | sort

หมายเหตุสิ่งนี้จะแสดงรายการสิ่งแปลก ๆ อื่น ๆ เช่น symlinks ซ็อกเก็ตและท่อเช่นกัน (แน่นอนจัดกลุ่มไว้อย่างเหมาะสม) แต่การพิจารณาว่าสิ่งนั้นค่อนข้างหายากที่ไม่ควรเป็นปัญหา มิฉะนั้นตัวกรองจะเป็น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

อ้างอิงจาก "The Long Format" ของ ls man page, เมื่อไฟล์ประเภทอื่นเข้ามาเกี่ยวข้อง, ลำดับผลลัพธ์ควรเป็น:

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

ฟังก์ชั่นทุบตีที่มีประโยชน์ (ใส่ไว้ใน. bash_profile หรือ. bashrc ของคุณ):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.