자동화를 통해 하위 폴더와 해당 콘텐츠를 한 수준 위로 이동하고 여러 폴더에서 빈 폴더를 삭제하세요.

자동화를 통해 하위 폴더와 해당 콘텐츠를 한 수준 위로 이동하고 여러 폴더에서 빈 폴더를 삭제하세요.

최상위 폴더(1)는 루트 폴더입니다.

폴더 상단(1)에는 폴더 상단(2)만 포함됩니다.

최상위 폴더(2)에는 최상위 폴더(3), (4), (5), (6), (7), (8), (9), (10)이 포함되어 있습니다.

상위 폴더 (3)~(10)에는 폴더와 파일이 포함되어 있습니다.

내가 하고 싶은 일은 상위 폴더가 최상위 폴더(1)가 되도록 최상위 폴더(3)를 한 수준 위(10)로 이동하는 것입니다. 그런 다음 동일한 명령을 사용하여 현재 비어 있는 최상위 폴더를 삭제합니다(2).

하단 폴더(1)에는 삭제된 폴더를 포함하여 원하는 폴더 구조가 표시됩니다.

보너스: 이와 같은 수백 개의 폴더가 포함된 루트 폴더가 있습니다. 따라서 해당 루트 폴더에 있으면 최상위 폴더(1)와 다른 여러 폴더가 표시됩니다. 나의 이상적인 솔루션은 각 폴더를 통과하여 아래와 같이 폴더 구조를 변경하는 bash 라인이나 스크립트를 만들 수 있는 것입니다.

 (1)->Packt.Learn.Javascript.and.HTML5.Canvas.Build.a.Paint.App.for.Drawing/
    (2)->LearnJavascriptandHTML5Canvas-BuildaPaintAppforDrawing[Video]
      (3)->1.Introduction/
      (4)->2.Algorithm of the game app/
      (5)->3.HTML5 Building Blocks of the App/
      (6)->4.Styling the Drawing_Paint app - achieving the final look/
      (7)->5.[OPTIONAL] Javascript Basic Concepts (related to this project)/
      (8)->6.[OPTIONAL]HTML5 Canvas Basic Concepts(related to this project)/
      (9)->7.Javascript code for the app - Making the app work/
     (10)->Exercise Files/

 (1)->Packt.Learn.Javascript.and.HTML5.Canvas.Build.a.Paint.App.for.Drawing/
   (2)->1.Introduction/
   (3)->2.Algorithm of the game app/
   (4)->3.HTML5 Building Blocks of the App/
   (5)->4.Styling the Drawing_Paint app - achieving the final look/
   (6)->5.[OPTIONAL] Javascript Basic Concepts (related to this project)/
   (7)->6.[OPTIONAL] HTML5 Canvas Basic Concepts (related to this project)/
   (8)->7.Javascript code for the app - Making the app work/
   (9)->Exercise Files/

답변1

레이블 이 있으므로 bash여기에 bash 배열을 사용하는 솔루션이 있습니다.

for book in *; do topdir=($book/*); chapters=("${topdir[0]}"/*); mv "${chapters[@]}" "$book"; rmdir "${topdir[0]}"; done

"book" 변수가 각 책의 이름으로 확인되도록 언급한 루트 폴더에서 이 명령을 실행해야 합니다.

솔루션은 이런 식으로 작동합니다. 각 책에 대해 배열 변수 "topdir"을 사용하여 최상위 디렉토리 이름을 읽습니다. 거기에서 최상위 디렉터리 아래의 장 디렉터리 목록을 가져옵니다. 그런 다음 장 목차를 전달하여 mv한 수준 위로 이동합니다. 완료되면 rmdir. rmdir비어 있지 않은 디렉토리는 삭제가 거부되므로 안전망입니다.

다음은 명령을 실행하기 전과 후의 디렉터리 구조를 보여주는 데모입니다(이 시스템에는 명령이 없으므로 tree출력은 다음과 같습니다 find).

앞으로:

$ find .
.
./Learn.Javascript.and.HTML5
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/1.Introduction
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/2.Algorithm of the game app
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/3.HTML5 Building Blocks of the App
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/4.Styling the Drawing_Paint app - achieving the final look
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/5.[OPTIONAL] Javascript Basic Concepts (related to this project)
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/6.[OPTIONAL]HTML5 Canvas Basic Concepts(related to this project)
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/7.Javascript code for the app - Making the app work
./Learn.Javascript.and.HTML5/LearnJavascriptandHTML5Canvas[Video]/Exercise Files

뒤쪽에:

$ find .
.
./Learn.Javascript.and.HTML5
./Learn.Javascript.and.HTML5/1.Introduction
./Learn.Javascript.and.HTML5/2.Algorithm of the game app
./Learn.Javascript.and.HTML5/3.HTML5 Building Blocks of the App
./Learn.Javascript.and.HTML5/4.Styling the Drawing_Paint app - achieving the final look
./Learn.Javascript.and.HTML5/5.[OPTIONAL] Javascript Basic Concepts (related to this project)
./Learn.Javascript.and.HTML5/6.[OPTIONAL]HTML5 Canvas Basic Concepts(related to this project)
./Learn.Javascript.and.HTML5/7.Javascript code for the app - Making the app work
./Learn.Javascript.and.HTML5/Exercise Files

관련 정보