SubDir名4の深さを抽出し、後で使用するためにVar 4に入れる方法は?

SubDir名4の深さを抽出し、後で使用するためにVar 4に入れる方法は?

4番目のディレクトリ名をツリーに入れる方法を知る必要があります。このディレクトリvarはループ操作中に変更されるため、このディレクトリ構造はループの実行時に常に更新されるため、更新して最新の状態に保つ必要があります。

/dir 1/dir 2/dir 3/dir 4/dir 5/ 他の場所で使用するには、4 番目のディレクトリの名前を var に入れる必要があります。

私はループを使用し、このように抽出します。

#!/bin/bash

working_dir="/media/data/temp1"

script_dir="$HOME/working"

find "$working_dir" -type f -name "*.*" | while [ $xf  -lt $numberToConvert ] ; 
do read FILENAME;

j=$FILENAME
xpath=${j%/*} 
xbase=${j##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path1=${xpath}

pref1=${xpref}
ext1=${xfext}
echo 
echo
echo "xpath is -> "$xpath""
echo "xbase is -> "xbase""
echo "xfext is -> "$xfext""
echo "xpref is -> "$xpref""
echo "path is -> "$path1""
echo "pref is -> "$pref1""
echo "ext is -> "$ext1""
echo
getme="$(basename "$working_dir/")" 
echo "GET ME "$getme""
echo

  //Code that does stuff to files in dir's after the 4th Dir
  // is here but hidden 

let xf++
done

これらの結果はすべて次のとおりです。

xpath is -> /media/data/temp1/Joe Jackson - The Ultimate Collection/CD2
xbase is -> xbase
xfext is -> mp3
xpref is -> Jumpin' Jive Live - Joe Jackson
path is -> /media/data/temp1/Joe Jackson - The Ultimate Collection/CD2
pref is -> Jumpin' Jive Live - Joe Jackson
ext is -> mp3

GET ME temp1

basename は、次の 4 番目のディレクトリではなく、3 番目のディレクトリを返します。これは、/ temp1 / ... /とCDの間のディレクトリ名を取得するために必要です。

/media/data/temp1/Joe Jackson - The Ultimate Collection/CD2

スクリプトが完了すると、Joe Jackson ...ディレクトリ名が変更され、別の名前の別の4番目のディレクトリに移動するため、それを更新して現在の4番目のディレクトリ名のみを取得できるようにする必要があります。

私が必要なのはこんなものだけです。

    4thDirNameIs=${code goes here}

5、3、または他のディレクトリまたはファイル名ではなく、ディレクトリ構造のレベル4。

タイトルはすべてを教えてくれます。 Enterはキーワードであり、ディレクトリに入るにはディレクトリの外になければならない4番目のディレクトリ名です。

今回は十分に明確になってほしいです。

ベストアンサー1

ファイルが$FILENAME。この例では手動で設定しました。

FILENAME="/media/data/temp1/Joe Jackson - The Ultimate Collection/CD2/Jumpin' Jive Live - Joe Jackson.mp3"
  • シェルの使用:

    $ dir=${FILENAME#*/*/*/*/}; echo ${dir//\/*}
    Joe Jackson - The Ultimate Collection
    

    ここでは、最初の4つのスラッシュを削除し、4番目のディレクトリとファイル名を保持してからファイル名を削除します。

  • シェルとbasename:

    $ dir=${FILENAME#*/*/*/*/}; basename "$dir"
    Jumpin' Jive Live - Joe Jackson.mp3
    

    basename最後のステップについてのみ上記とほぼ同じアイデアです。

  • Perlで分析してみてください:

    $ エコー "$FILENAME" #(.? /){4}(.?)/.*#$2#' ジョー・ジャクソン - Ultimate Collection

    正規表現は、ゼロ個以上の文字が4回繰り返された項目とスラッシュが続き、次のスラッシュがあるすべての項目とその他のすべての項目を一致させます。括弧を使用すると、一致するパターンをキャプチャできるため、すべてを2番目のパターン(ディレクトリ名)に置き換えます。

    あるいは、行をslapehsの配列に分割し、5番目のフィールドを印刷することもできます(5番目のフィールドは、変数が最初のフィールドを空にし/始めるためです)。

    $ echo "$FILENAME" | perl -F"/" -lane 'print $F[4]'
    Joe Jackson - The Ultimate Collection
    
  • 解析awk:

    $ echo "$FILENAME" | awk -F"/" '{print $5}'
    Joe Jackson - The Ultimate Collection
    

    同じ考えですがawk

おすすめ記事