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

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

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



답변

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 이외의 디렉토리를 먼저 나열 ls:

ls -l | sort

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


답변

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


답변

대한 zsh의 완료 목록, 당신은 설정할 수 있습니다 list-dirs-first에 스타일 true디렉토리가 먼저 표시 할 수 있습니다. 당신의 ~/.zshrc:

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

(여기서는이 를 지원하는 모든 완성 위젯과 모든 명령에 적용됩니다. 원하는 경우 자세한 내용은 zstyle설명서를 참조하도록 제한 할 수 있습니다 )

아직 그렇게하지 않았다면 compinstall, 설명 등을 포함한 색상으로 완성 목록을 얻으려면 실행해야합니다 .


답변

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


답변