ディレクトリツリーの最も深いレベルでファイル名を指定する方法

ディレクトリツリーの最も深いレベルでファイル名を指定する方法

基本的なBashコマンドとスクリプトを使用してディレクトリツリーの最も深いレベルで任意のファイル名を指定するにはどうすればよいですか?

関数なしで1行のコードでできる方法を探しています。また、現在のディレクトリから始めて下に作業しているとします。

findgrepおよびsedawk許可されるコマンドです。

現在の試みは次のとおりですが、機能しません。

検索 - 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";

これによりディレクトリのみが検索されます。

最も簡単な方法でこの問題を解決するには?

答え1

変なお願いですね!

最も深いディレクトリにあるファイルをインポートするには、find+を使用します。awk

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

${deepest}コマンドで使用するmvことは練習用ですが、次の5行を使用するとより役に立ちます。

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

私はこれを選択します。ただし、ファイル名の前にスペースが含まれていると失敗します。 1つ目はファイル名のみを出力し、2つ目はファイルパスも含みます。

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

関連情報