기본 Bash 명령과 스크립트를 사용하여 디렉토리 트리의 가장 깊은 수준에서 임의의 파일 이름을 지정하려면 어떻게 해야 합니까?
함수 없이 한 줄의 코드로 할 수 있는 방법을 찾고 있어요. 또한 현재 디렉토리에서 시작하여 아래로 작업한다고 가정합니다.
find
, grep
및 sed
는 awk
허용되는 명령입니다.
현재 시도는 다음과 같지만 작동하지 않습니다.
찾기 - 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//'