나는 다음과 같은 구조를 가진 수많은 파일을 가지고 있습니다: /base/에 있는 모든 파일, 2개의 "임의" 문자가 있는 4개의 폴더, 그리고 서로 관련된 일련의 파일.
예:
/base/ab/12/13/37/file1.txt
/base/ab/12/13/37/file2.txt
/base/ab/12/13/37/file3.txt
/base/cd/b8/e2/a1/other1.txt
....
/base/cd/b8/e2/a1/other52.txt
/base/af/f3/45/9e/third1.txt
/base/af/f3/45/9e/third2.txt
등
대부분의 구조를 유지하되 내 파일이 속한 끝에 추가(extra_folder) 폴더를 추가하고 싶습니다. 따라서 위의 내용을 다음과 같이 변경하십시오.
/base/ab/12/13/37/extra_folder/file1.txt
/base/ab/12/13/37/extra_folder/file2.txt
/base/ab/12/13/37/extra_folder/file3.txt
/base/cd/b8/e2/a1/extra_folder/other1.txt
나는 쉘 스크립트와 이동 명령이 필요할 것이라고 예상했습니다.
매우 감사합니다.
답변1
이것이 우리가 시작하는 곳입니다:
$ tree base/
base/
|-- ab
| `-- 12
| `-- 13
| `-- 37
| |-- file1.txt
| |-- file2.txt
| `-- file3.txt
|-- af
| `-- f3
| `-- 45
| `-- 9e
| |-- third1.txt
| `-- third2.txt
`-- cd
`-- b8
`-- e2
`-- a1
|-- other1.txt
`-- other52.txt
12 directories, 7 files
먼저 새 디렉터리를 추가합니다.
$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'
우리는 네 번째 수준에서 새 디렉토리를 생성하는 데만 -mindepth 4
및 를 사용합니다 . -maxdepth 4
그렇지 않은 경우 -mindepth 4
더 높은 수준의 새 디렉토리를 얻게 되며, 새 디렉토리가 없으면 경로 이름이 너무 길어서 더 이상 디렉토리를 생성할 수 -maxdepth 4
없을 때까지 해당 디렉토리 자체가 새 디렉토리로 채워집니다 .find
디렉토리 는 에서 호출하여 생성 extra_folder
됩니다 . 이제 우리는mkdir
-exec
$ tree base/
base/
|-- ab
| `-- 12
| `-- 13
| `-- 37
| |-- extra_folder
| |-- file1.txt
| |-- file2.txt
| `-- file3.txt
|-- af
| `-- f3
| `-- 45
| `-- 9e
| |-- extra_folder
| |-- third1.txt
| `-- third2.txt
`-- cd
`-- b8
`-- e2
`-- a1
|-- extra_folder
|-- other1.txt
`-- other52.txt
15 directories, 7 files
그런 다음 파일을 아래로 이동합니다.
$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'
이렇게 하면 다섯 번째 수준 디렉터리나 그 아래에 있는 일반 파일을 찾을 수 있습니다 base
(최하위 수준에만 파일이 있다고 가정합니다). 그런 다음 발견된 파일이 있는 디렉터리 -execdir
(발견된 파일의 기본 이름이 됨) 내에서 명령을 실행하는 데 사용됩니다.mv
{}
우리는 마침내 얻습니다
$ tree base/
base/
|-- ab
| `-- 12
| `-- 13
| `-- 37
| `-- extra_folder
| |-- file1.txt
| |-- file2.txt
| `-- file3.txt
|-- af
| `-- f3
| `-- 45
| `-- 9e
| `-- extra_folder
| |-- third1.txt
| `-- third2.txt
`-- cd
`-- b8
`-- e2
`-- a1
`-- extra_folder
|-- other1.txt
`-- other52.txt
15 directories, 7 files
한 번에:
$ find base -type f \
-execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'
extra_folder
그러면 시작 위치에 관계없이 모든 일반 파일을 찾아서 이름이 지정된 디렉토리로 이동합니다 . 이 명령을 여러 번 실행하면 명령이 점점 더 아래로 이동합니다.
다음과 같은 미니 스크립트가 호출됩니다 -execdir
.
[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"
폴더 이름은 , 파일 이름은 $1
으로 호출되며 $2
, 폴더가 없으면 폴더를 생성한 다음 파일을 그 폴더로 이동합니다.