이것은 아마도 간단한 것이지만 알아낼 수는 없습니다. 다음과 같은 디렉토리 구조가 있습니다( dir2
내부 dir1
).
/dir1
/dir2
|
--- file1
|
--- file2
file1
get 및 file2
not을 사용하여 dir1
이 디렉토리 구조를 "평면화"하는 가장 좋은 방법은 무엇입니까 dir2
?
답변1
find
GNU와 GNU를 사용하여 이 작업을 수행 할 수 있습니다 mv
.
find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +
기본적으로 find
전체 디렉토리 트리를 순회하면서 -type f
최상위 디렉토리( )에 없는 모든 파일( ) 에 대해 원하는 디렉토리( )로 이동을 -mindepth 2
실행합니다 . 인수를 사용하면 대상 디렉터리를 먼저 지정할 수 있습니다. 이는 양식에서 모든 소스 위치를 명령 끝에 넣기 때문에 필요합니다. make는 중복 항목을 덮어쓰기 전에 묻습니다 . 묻지 않고(또는 묻거나 덮어쓰지 않고) 덮어 쓸 수 있습니다 .mv
-exec mv … +
-t
mv
+
-exec
-i
mv
-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
이를 활성화 하려면 실행하세요.rmdir
zmodload 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