중첩된 디렉터리 평면화

중첩된 디렉터리 평면화

이것은 아마도 간단한 것이지만 알아낼 수는 없습니다. 다음과 같은 디렉토리 구조가 있습니다( dir2내부 dir1).

/dir1
    /dir2 
       |
        --- file1
       |
        --- file2

file1get 및 file2not을 사용하여 dir1이 디렉토리 구조를 "평면화"하는 가장 좋은 방법은 무엇입니까 dir2?

답변1

findGNU와 GNU를 사용하여 이 작업을 수행 할 수 있습니다 mv.

find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +

기본적으로 find전체 디렉토리 트리를 순회하면서 -type f최상위 디렉토리( )에 없는 모든 파일( ) 에 대해 원하는 디렉토리( )로 이동을 -mindepth 2실행합니다 . 인수를 사용하면 대상 디렉터리를 먼저 지정할 수 있습니다. 이는 양식에서 모든 소스 위치를 명령 끝에 넣기 때문에 필요합니다. make는 중복 항목을 덮어쓰기 전에 묻습니다 . 묻지 않고(또는 묻거나 덮어쓰지 않고) 덮어 쓸 수 있습니다 .mv-exec mv … +-tmv+-exec-imv-f-n

Stephane Chazelas가 지적했듯이 위의 내용은 GNU 도구에만 적용됩니다(Linux에서는 표준이지만 대부분의 다른 시스템에는 적용되지 않음). 아래 코드는 여러 번 호출되기 때문에 약간 느리지 mv만 더 일반적입니다.

find /dir1 -mindepth 2 -type f -exec mv -i '{}' /dir1 ';'

POSIXly에서는 여러 인수를 전달하지만 대상 디렉터리가 끝에 오도록 sh인수 목록을 다시 정렬합니다 .mv

LC_ALL=C find /dir1 -path '/dir1/*/*' -type f -exec sh -c '
  exec mv "$@" /dir1' sh {} +

답변2

zsh에서:

mv dir1/*/**/*(.D) dir1

**/하위 디렉터리를 재귀적으로 탐색합니다. 이것글로벌 예선 .일반 파일만 일치시키고 D도트 파일을 포함해야 합니다(이름이 a로 시작하는 파일은 기본적으로 와일드카드 일치에서 제외됩니다 .). 나중에 비어 있는 디렉토리를 정리하려면 rmdir dir1/**/*(/Dod)--restricts /todirectories를 실행하고 od일치 깊이를 먼저 정렬하여 dir1/dir2/dir3이전 dir1/dir2.

파일 이름의 전체 길이가 매우 길면 명령줄 길이에 제한이 발생할 수 있습니다. Zsh 에는 이 제한의 영향을 받지 않는 내장 기능이 있습니다. mv이를 활성화 하려면 실행하세요.rmdirzmodload zsh/files

POSIX 도구만 사용하십시오.

find dir1 -type f -exec mv {} dir1 \;
find dir1 -depth -exec rmdir {} \;

또는 (각 파일에 대해 별도의 프로세스를 실행할 필요가 없으므로 더 빠릅니다)

find dir1 -type f -exec sh -c 'mv "$@" dir1' _ {} +
find dir1 -depth -exec rmdir {} +

답변3

tar와 zip 모두 디렉터리 구조를 병합한 다음 제거할 수 있으므로 중첩된 디렉터리를 빠르게 평면화할 수 있었습니다.

tar -cvf all.tar *

그런 다음 all.tar를 새 위치로 이동하십시오.

tar -xvf all.tar --strip=4

답변4

이 시도:

cp /dir1/dir2/file{1,2} /another/place

file[0-9]*또는 하위 디렉터리의 일치하는 모든 파일에 대해 다음을 수행합니다.

cp /dir1/dir2/file[0-9]* /another/place

바라보다http://mywiki.wooledge.org/glob

관련 정보