깊게 중첩된 하위 디렉터리의 이름을 새 폴더로 복제하고 평면화하는 방법

깊게 중첩된 하위 디렉터리의 이름을 새 폴더로 복제하고 평면화하는 방법

예 두 번째 수준(2 및 22)에 두 개의 분기가 있는 다음과 같은 입력 디렉터리가 있습니다.

~/input_directory/1/2/3/4/5/6

~/input_directory/1/22/3/4/5/6

해당 이름을 가진 (빈) 하위 디렉터리를 포함하도록 설정된 단일 수준 하위 디렉터리를 채우는 명령을 실행하고 싶습니다. ~/output_directory따라서 output_directory 아래의 단일 하위 디렉터리는 다음과 같이 간단하게 평면화됩니다.

  ./1   ./2 ./22  ./3  ./4  ./5  ./6

원래 input_directory는 변경되지 않습니다.


사용

find . -type d -exec echo {} \; 

수확량

./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/22
./1/22/3
./1/22/3/4
./1/22/3/4/5
./1/22/3/4/5/6

나는 이것이 효과가 있을 것이라고 생각했습니다:

find . -type d -maxdepth 10 -print0 | xargs -0 mkdir -p  ~/output_folder

그러나 슬프게도 그렇지 않습니다(만약에 대비하여 거기에 넣은 -max깊이가 있든 없든).

find . -type d -maxdepth 10 -print0 | xargs -0 ls -al  

올바르게 실행되었으므로 거의 다 왔나요?

도움을 주셔서 감사합니다.

답변1

왜 당신이 그것을 원하는지 명확하게 이해하지 못했기 때문에 그것이 당신이 원하는 것인지 확실하지 않지만 이것을 시도해 볼 수 있습니다

  [user@host ~]$ ls 1
2  22
  [user@host ~]$ ls -R 1
1:
2  22

1/2:
3

1/2/3:
4

1/2/3/4:
5

1/2/3/4/5:
6

1/2/3/4/5/6:

1/22:
3

1/22/3:
4

1/22/3/4:
5

1/22/3/4/5:
6

1/22/3/4/5/6:

이제 이것을 실행해 보십시오:

 mkdir output_directory; find 1 -type d -exec echo {} \; > dirs.txt; for dir in $(cat dirs.txt); do if [ ! -d  output_directory/${dir##*/} ]; then mkdir output_directory/${dir##*/}; fi; done;

[user@host ~]$  ls output_directory/
1  2  22  3  4  5  6

답변2

Danila의 훌륭한 답변에서 이것이 나의 최종 버전입니다.

find . -type d -exec echo {} \; > /tmp/tempdirs.txt; \
for dir in $(cat /tmp/tempdirs.txt); do \
  if [ ! -d ~/output_directory/${dir##*/} ]; then \
    mkdir -p ~/output_directory/${dir##*/}; \
  fi; \
done;

답변3

를 사용 basename하여 찾은 경로의 마지막 부분을 가져와 find결과를 널로 구분하여 출력하고 xargswith replace-str( -I)를 사용하여 기본 이름을 출력 디렉터리에 추가할 수 있습니다.

find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}

관련 정보