디렉토리가있는 파일 및 디렉토리를 먼저 나열하는 방법


22

두 가지 질문이 있습니다. 먼저, 어떤 명령이 파일과 디렉토리를 나열하지만 디렉토리를 먼저 나열합니까?

두 번째 질문 : 파일 목록을 단일 디렉토리에 복사하고 싶지만 대상 디렉토리를 명령의 첫 번째 파일 이름으로 만드십시오.


5
ls--group-directories-first스위치를.
jasonwryan

1
-tcp명백한 대상 디렉토리를 취하는 GNU 전용 옵션 이므로 시작을 포함하여 명령 행의 어느 곳으로나 갈 수 있습니다.
jw013

답변:


36

GNU가 있습니까?

의 gnu 버전 ls--group-directories-first입니다. 그리고 cp있다 -t.

GNU가 없습니까?

gnu 's가없는 시스템 에서 / 와 적절한 옵션 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-exec-print0옵션 xargs-0옵션을 선택합니다.

디렉토리 트리를 효율적으로 복사하기위한 대체 도구입니다.

rsync대신 사용하는 것이 좋습니다. 작업을 쉽게 할 수있는 많은 기능이 있습니다.


대단하다. 좀 더 일반적으로 GNU 버전이 있는지 알 수있는 방법이 있습니까? (옵션을 시도하는 것 이외 --group-directories-first).
Amelio Vazquez-Reina

3
당신은 ls --version당신이 가지고있는 것을 찾을 수 있습니다.
Shawn J. Goff

6

GNU 이외의 디렉토리를 먼저 나열 ls:

ls -l | sort

이것은 심볼릭 링크, 소켓 및 파이프와 같은 다른 이상한 것들을 모두 나열하지만 (물론 그룹화 됨) 문제가되지 않아야한다는 것을 고려하는 것은 매우 드 rare니다. 그렇지 않으면 필터는ls -l | grep '^(-|d)' | sort


1
허용 된 답변보다 영리하고 짧은 +1 그것을 정말로 제외하고sort -r.
PythonNut

1
ls -l | Mac에서는 sort가 작동하지 않았습니다. 디렉토리를 먼저 그룹화하지만 파일 이름을 정렬하거나 정렬하지 않았습니다.
Ray

참고 :`| sort`는 이제 텍스트이므로 색상을 제거합니다.
JayRizzo

4

bashzsh에서 작동합니다.

~ / .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 -l9 개의 필드를 포함해야합니다.
  • 행이 '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 } }'
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.