
基本的なBashコマンドとスクリプトを使用してディレクトリツリーの最も深いレベルで任意のファイル名を指定するにはどうすればよいですか?
関数なしで1行のコードでできる方法を探しています。また、現在のディレクトリから始めて下に作業しているとします。
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";
これによりディレクトリのみが検索されます。
最も簡単な方法でこの問題を解決するには?
答え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//'