디렉토리 트리의 가장 깊은 수준에서 파일 이름을 지정하는 방법

디렉토리 트리의 가장 깊은 수준에서 파일 이름을 지정하는 방법

기본 Bash 명령과 스크립트를 사용하여 디렉토리 트리의 가장 깊은 수준에서 임의의 파일 이름을 지정하려면 어떻게 해야 합니까?

함수 없이 한 줄의 코드로 할 수 있는 방법을 찾고 있어요. 또한 현재 디렉토리에서 시작하여 아래로 작업한다고 가정합니다.

find, grepsedawk허용되는 명령입니다.

현재 시도는 다음과 같지만 작동하지 않습니다.

찾기 - d | 선언 COUNT=-1; 선언 C=$(echo $LINE | s/\// \n \//g" | grep '/' -c); echo $C; if [ $COUNT -gt $C ]; then let COUNT=$C; let P=$LINE; echo "complete"; ;complete

그러면 디렉토리만 검색됩니다.

가장 간단한 방법으로 이 문제를 해결하는 방법은 무엇입니까?

답변1

이상한 부탁이군요!

가장 깊은 디렉토리에 있는 파일을 가져오려면 find+를 사용합니다 .awk

bash-3.2$ deepest=$(find / -type f | awk -F'/' 'NF > depth {
>     depth = NF;
>     deepest = $0;
> }
>
> END {
>     print deepest;
> }')

${deepest}명령에 사용하는 mv것은 연습용이지만 다음 다섯 줄을 사용하면 더 많은 도움이 될 수 있습니다.

bash-3.2$ echo "${deepest}"
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb

bash-3.2$ echo "${deepest%.*}"
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires

bash-3.2$ echo "${deepest%/*}"
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina

bash-3.2$ echo "${deepest##*/}"
Buenos_Aires.rb

bash-3.2$ echo "${deepest##*.}"
rb

아래 질문이 업데이트되었습니다.

find -type d[...]"그러면 디렉토리만 검색됩니다.[...] 이 문제를 가장 간단한 방법으로 해결하는 방법은 무엇입니까? ".

-type f공급 함으로써find모두 찾기문서( f), 전부는 아님목차( d).

답변2

일부 중괄호가 누락되어 비교가 취소되었으며 결과를 인쇄해야 합니다.

find -type d | {
  declare COUNT=-1
  declare P=""
  while read LINE
    do echo $LINE
    declare C=$(echo $LINE | cut -c3- | sed "s/\//\n\//g" | grep '/' -c)
    echo $C
    if [ $C -gt $COUNT ]; then let COUNT=$C; let P=$LINE; echo "Done"; fi
  done
  echo deepest: "$P"
}

디버깅 내용을 없애고 약간 개선된 버전입니다.

find -type d -links 2 | (
  declare COUNT=-1
  P=""
  while IFS= read -r LINE; do
    declare C=$(echo $LINE | tr -cd / | wc -c)
    if [ $C -gt $COUNT ]; then let COUNT=$C; P=$LINE; fi
  done
  echo deepest: "$P"
)

답변3

find -type f | awk -F/ 'NF > maxdepth { maxdepth = NF; file = $0 }; END {print file}'

이건 본질적으로 같은 것 같아요이 답변귀하가 게시한 다른 질문과 관련하여, 그/이것에 무슨 문제가 있나요?

답변4

저는 이것을 선택하겠습니다. 단, 파일 이름 앞에 공백이 포함되어 있으면 실패합니다. 첫 번째는 파일 이름만 출력하고 두 번째는 파일 경로도 포함합니다.

find -type f | sed 's:[^/]*/: :g' | LC_ALL=C sort | head -1 | sed 's/^ *//'

find -type f | sed 'h;s:[^/]*/: :g;G;s/\n/\t/' | LC_ALL=C sort | head -1 | sed 's/.*\t//'

관련 정보