경로를 통해 일부 정보에 "태그"를 붙인 사진과 비디오가 포함된 디렉토리 트리가 있습니다. 내가 원하는 것은 특정 이름의 모든 폴더를 별도의 폴더로 이동하되 해당 이름의 모든 폴더 인스턴스에 대한 경로를 재현하는 것입니다. 예를 들어 다음과 같이 시작합니다.
/Media
.../Pics
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
............./Europe
................/Italy
................/Spain
....../Home
.../Vids
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
............./Europe
................/Italy
................/Spain
....../Home
정확한 이름이 "Europe"인 폴더를 이동하고 싶다고 가정해 보겠습니다. 즉, "Europe"을 하위 문자열로 사용하지 않고 "Europe"이라는 폴더와 해당 하위 폴더만 이동합니다. 원하는 결과:
/Media
.../Pics
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
....../Home
.../Vids
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
....../Home
/New
.../Pics
....../Travel
........./Round-The-World2
............./Europe
................/Italy
................/Spain
.../Vids
....../Travel
........./Round-The-World2
............./Europe
................/Italy
................/Spain
이는 다음과 다소 유사합니다.특정 파일 확장자를 가진 파일을 추출하고 디렉터리 구조를 보존하시겠습니까?, 그러나 저는 Linux cli의 초보자이고 조직을 망칠 위험을 감수하고 싶지 않습니다. 따라서 도움을 주시면 대단히 감사하겠습니다 :)
답변1
아래 답변을 보기 전에 고려해야 할 한 가지는 처음부터 끝까지 전체 경로를 효과적으로 다시 생성한다는 것입니다./
상위 폴더 구조와 해당 내용을 정확하게 복사하는 대신 상위 폴더 구조를 다시 만들고 싶기 때문에 이는 여러 단계의 프로세스가 됩니다. 구조는 다음과 같습니다
home/
├── fol_a
│ ├── fol_ABC
│ │ └── My Folder
│ │ └── file 2
│ └── fol_XYZ
│ └── My Folder
│ ├── file1
│ └── fol_extra
│ └── file 3
└── my test
11 directories, 3 files
즉, 전체 경로 file1
는 입니다 /home/fol_a/fol_XYZ/My Folder/file1
. 우리의 목표는 My Folder
폴더와 그 내용을 이동 하여 my test
경로가 다음과 같이 /home/my test/home/fol_a/fol_XYZ/My Folder/*
되도록 하는 것입니다./home/my test/home/fol_a/fol_ABC/My Folder/*
1. 디렉터리 구조를 다시 구축하고 적절한 폴더와 해당 내용을 복사합니다.
이름이 같은 폴더가 있는 분기의 상위 폴더에서 실행하면(우리의 경우에는 fol_a
, 귀하의 폴더에는 없음 /Media
) 다음을 수행할 수 있습니다.
노트:bash -c
변수를 입력하려면 DEST와 SOURCE가 필요하므로 이 변수를 내보냅니다.find
DEST=대상 경로 SOURCE=복사할 폴더 이름, 전체 경로 다시 생성 BRANCH=복사하려는 동일한 이름을 가진 폴더의 공개 분기
export DEST="/home/my test"
export SOURCE="My Folder"
export BRANCH="/home/fol_a"
find "$BRANCH" -type d -name "$SOURCE" -exec bash -c 'mkdir -p "$DEST""$(realpath "{}")" ; cp -r "{}"/* "$DEST""$(realpath "{}")"' \;
참고: 다음과 유사한 메시지가 표시되는 경우 cp: cannot stat './[FOLDERNAME]/*': No such file or directory
**이것은 버그가 아니며 단지 의미할 뿐입니다**cp -r [FOLDERNAME]/*
명령이 빈 폴더에서 실행되었습니다.
다시 생성된 폴더 트리와 대상 폴더의 내용을 확인하세요
폴더 구조와 파일을 빠르게 확인하여 복사본이 올바른지 확인하려면 다음을 실행할 수 있습니다.
tree "$DEST"/..
이 단계(삭제 전)에서 전체 폴더 트리는 다음과 같습니다.
home/
├── fol_a
│ ├── fol_ABC
│ │ └── My Folder
│ │ └── file 2
│ └── fol_XYZ
│ └── My Folder
│ ├── file1
│ └── fol_extra
│ └── file 3
└── my test
└── home
└── fol_a
├── fol_ABC
│ └── My Folder
│ └── file 2
└── fol_XYZ
└── My Folder
├── file1
└── fol_extra
└── file 3
14 directories, 6 files
2. 이전 공개 분기에서 폴더 트리를 삭제합니다.
마지막으로(모든 파일이 실제로 적절한 폴더 등에 있는지 다시 확인한 후) 모든 것이 올바르게 보이고 실제로 해당 내용과 해당 내용(복사뿐만 아니라)을 이동하려는 경우 fol_d
다음 명령을 사용하여 수행할 수 있습니다.
이전에 선언된 동일한 공개 지점에서(위 예에서 /home/fol_A
)
find "$BRANCH" -type d -name "$SOURCE" -exec rm -r "{}" \;
노트: 비슷한 메시지를 받을 수 있지만 이는 find [$SOURCE] :No such file or directory
및 명령을 사용하여 콘텐츠와 디렉터리를 삭제할 때 다소 정상적인 현상입니다.find
-exec
마지막 검사가 실행 tree
되고 최종 출력은 다음과 같습니다.
home/
├── fol_a
│ ├── fol_ABC
│ └── fol_XYZ
└── my test
└── home
└── fol_a
├── fol_ABC
│ └── My Folder
│ └── file 2
└── fol_XYZ
└── My Folder
├── file1
└── fol_extra
└── file 3
11 directories, 3 files