SubDir 이름 4 깊이를 추출하고 나중에 사용하기 위해 Var 4에 넣는 방법은 무엇입니까?

SubDir 이름 4 깊이를 추출하고 나중에 사용하기 위해 Var 4에 넣는 방법은 무엇입니까?

네 번째 디렉터리 이름을 트리에 넣는 방법을 알아야 합니다. 이 디렉터리 var는 루프 작업 중에 변경되므로 이 디렉터리 구조는 루프가 실행될 때 항상 업데이트되므로 업데이트하고 최신 상태로 유지해야 합니다.

/dir 1/dir 2/dir 3/dir 4/dir 5/ 다른 곳에서 사용하려면 네 번째 디렉토리의 이름을 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은 그 다음의 네 번째 디렉터리가 아닌 세 번째 디렉터리를 반환합니다. 이는 /temp1/.../과 CD 사이의 디렉터리 이름을 가져오는 데 필요한 것입니다.

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

스크립트가 완료되면 Joe Jackson... 디렉토리 이름이 변경되어 다른 이름을 가진 또 다른 네 번째 디렉토리로 이동하므로 이를 업데이트하고 현재 네 번째 디렉토리 이름만 가져오도록 유지할 수 있어야 합니다.

내가 필요한 건 이런 줄뿐이야

    4thDirNameIs=${code goes here}

5나 3이나 다른 디렉터리나 파일 이름이 아닌 디렉터리 구조의 수준 4입니다.

제목이 모든 것을 말해줍니다. Enter는 키워드이며, 디렉토리에 들어가려면 디렉토리 외부에 있어야 하는 네 번째 디렉토리 이름입니다.

이번에는 충분히 명확해졌으면 좋겠습니다

답변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개의 슬래시를 제거하고 네 번째 디렉터리와 파일 이름을 유지한 다음 파일 이름을 제거합니다.

  • 쉘 및 basename:

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

    basename마지막 단계 에 대해서만 위와 거의 같은 아이디어입니다 .

  • Perl로 분석해 보세요:

    $ 에코 "$FILENAME" #(.? /){4}(.?)/.*#$2#' 조 잭슨 - 얼티밋 컬렉션

    정규식은 0개 이상의 문자가 4번 반복된 항목과 슬래시가 뒤따르고, 다음 슬래시가 있는 모든 항목과 그 밖의 모든 항목을 일치시킵니다. 괄호를 사용하면 일치하는 패턴을 캡처할 수 있으므로 모든 것을 두 번째 패턴(디렉터리 이름)으로 바꿉니다.

    또는 행을 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.

답변2

min뎁스 및 최대 깊이 매개변수를 사용하여 해당 매개변수를 찾아 awk로 파이프할 수 있습니다.

find $someBaseDir -type d -mindepth 4 -maxdepth 4 | awk -F'/' '{ print $NF }'

각 결과에 대해 뭔가를 수행하려면 for 루프에 넣을 수 있습니다.

어쩌면 다음과 같은 것일 수도 있습니다.

for fdir in $(find $Base -type d -mindepth 4 -maxdepth 4 | awk -F'/' '{ print $NF }'); do DO_STUFF_WITH $fdir done

답변3

Jong의 답변은 매우 유사하지만 mindepthmaxdepth인수는 명령의 시작 디렉토리와 관련이 있습니다 find. 필요한 디렉터리 구조의 처음 세 부분이 이미 있다는 사실도 고려할 수 있습니다. 이제부터는 정말 그냥 가셔야 해요하나원하는 정보를 얻으려면 더 깊이 들어가 보세요. 이는 디렉토리의 다른 모든 항목을 제외하는 추가 이점이 있습니다.와는 별개로당신이 원하는 것을 위해. 다음 코드 조각은 사전 정의된 변수 $working_dir, -mindepth매개 -maxdepth변수 find및 매개변수 확장을 사용하여 /media/data/temp1에서 "4 깊이"의 모든 디렉터리를 찾습니다.

for my_dir in $(find ${working_dir} -mindepth 1 -maxdepth 1 -type d -print)
    do
    DirName=${my_dir##${working_dir}/}
    ## loop through, working on the 4th directory list
    ## one directory at a time
    . . .
done

FWIW, 변수 이름을 숫자로 시작하면 안 됩니다. BASH와 같은 일부 쉘은 이를 위치 매개변수에 대한 참조로 삽입하지만 예상한 대로 작동하지 않습니다(예: 존재할 수도 있고 존재하지 않을 수도 있는 $4thDirNameIs위치 매개변수로 확장한 다음 "thDirNameIs"가 옴).$4

답변4

이 질문에 도움을 주신 모든 분들께 감사드립니다. 이것이 제가 생각해낸 답입니다. 루트/폴더에서 네 번째 디렉터리까지 모든 디렉터리를 찾은 다음 한 번에 한 디렉터리로 이동하여 모든 파일을 가져오고 보관합니다. 순환의 가장 안쪽 수준에서 작동합니다. 선택한 파일이 모두 완료되면 다음 기반의 네 번째 위치로 이동한 다음 해당 하위 디렉터리도 동일한 작업을 수행합니다.

작업할 디렉토리 수와 위치를 제어하는 ​​것은 사용자 입력에 달려 있습니다.

#!/bin/bash

typeset -i f d control DirCountDn fileCount dirCount
let f=0 d=0 control=1  DirCountDn=0 fileCount=0 dirCount=0

amount_of_dir_to_work_on="4"

working_dir="/media/data/music"


   #CONTROL LOOP keeps it one dir at a time
        for i in 1
        do
            # get all of the names of the base dir to change name  a var containing ampunt of basenamedir in last place here 
            find "$working_dir" -mindepth 1 -maxdepth 1 -type d | while [ $DirCountDn  -lt $amount_of_dir_to_work_on ] ; 
                do read DIRNAME;
                    echo "$DIRNAME"
                    echo
                    MAXMP3="$(find "$DIRNAME" -type f -name "*.mp3" | wc -l)"
                    echo;echo;echo
                    echo "amount of mp3 "$MAXMP3" in "$DIRNAME""
                    echo;echo;echo;echo
                        find "$DIRNAME" -type f -name "*.mp3" | while [ $fileCount -lt $MAXMP3 ] ;
                        do read FILENAME;
                            echo;echo
                            echo "***************************************"
                            echo "FILENAME is "$FILENAME""
                            DIRNAME=${DIRNAME#*/*/*/*/} 
                            DIRNAME=${DIRNAME//\/*}
                            echo "DIRNAME is "$DIRNAME""
                            echo
                            echo " work each mp3 file in incurments until Dir is finised will all mp3 files" 
                            echo "rename dir then make provisons to move it somewhere else"
                            echo "then move it - go onto nest directory within the tree root dir"
                            echo "amount of filename "$fileCount""
                            echo "******************************************"
                            let fileCount++
                            echo "count on file names "$fileCount""
                            echo;echo

                        done
                let dirCount++
                echo "Dir Count "$dirCount""
                echo;echo
                let DirCountDn++

                #reset fileCount for next dir
                let fileCount=0
                done

                echo "this is i -> "$i""
        done

 # returns sub dir only one deep and not working dir
#find /dir/dir/dir/getThisOneNameOnly  -mindepth 1 -maxdepth 1  -type d   -exec basename {} \;

관련 정보