모든 디렉토리 내에 재귀 적으로 “사진”폴더를 만듭니다. 있는데 모든 폴더를 반복하고 각 폴더에 “사진”이라는

폴더가 여러 개 있는데 모든 폴더를 반복하고 각 폴더에 “사진”이라는 다른 폴더를 만듭니다.

F1
--F11
----F111
----F112
--F12

가지고 싶다:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo


답변

F1 바로 위의 디렉토리에서 다음 스크립트를 실행하십시오.

스크립트의 목적은 사진 디렉토리 아래에 중복 사진 디렉토리가 생성되지 않도록하는 것입니다.

또한 실수로 사용자의 루트 디렉토리와 같은 잘못된 위치에서 디렉토리를 실행하지 않도록 설계되었지만 F1디렉토리를 볼 수 없으며 잘못된 궁전에 수백 개의 사진 디렉토리를 실수로 생성합니다.

또한 사용자가 스크립트를 사용자 정의 할 수 있도록 스크립트를 쉽게 따라갈 수 있도록 의도했습니다.

#!/bin/bash

while IFS= read -r -d '' i;
do
    if [[ ! -d $i/Photo ]]; then
        # Filter to skip folders named Photo
        thisfolder="$(echo $i | sed "s/.*\///")"
        if [[ ! $thisfolder == "Photo" ]]; then
            mkdir "$i/Photo"
        fi
    fi
done < <(find F1 -type d -print0)

스크립트 업데이트 :

  • 소문자를 대문자 p로 변경했습니다 photo.
  • 비 스탠 더 파일 이름에 대한 지원이 추가되었습니다 (Terdon의 제안 포함).

답변

단일 find통화를 사용하여 달성 할 수 있습니다 .

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

이 부분 -name 'Photo' -prune -o은 기존 (및 새로 작성된) Photo디렉토리로 재귀하지 않도록 지시 합니다. 발견 된 파일 (또는 디렉토리)의 이름이 Photo있으면 처리를 중지하십시오 ( -prune). 다른 경우 ( -o), 디렉토리 ( -type d)를 계속 진행 -exec하고 명령을 실행 ( )하십시오.


답변

이런 식 find으로 while대신 결과를 전달할 수 있습니다 for. 파일 이름에 공백이 있으면 중단되지 않습니다.

먼저 디렉토리로 cd F1한 후 다음을 수행하십시오.

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

디렉토리가 존재하면 디렉토리 mkdir작성을 거부하므로 아무런 문제가 없습니다 …

디렉토리 이름에 개행 문자 또는 기타 이상한 점이있을 수 있으면 임의의 이름을 처리 할 수 ​​있습니다.

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done

도움을 주신 @terdon에게 감사드립니다. 🙂


답변

Python을 사용 os.walk하면 몇 줄의 코드로 매우 쉽고 간단하게 할 수 있습니다.

$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'
$ tree
.
├── dir_one
│   └── Pictures
├── dir_two
│   ├── dir_three
│   │   └── Pictures
│   └── Pictures
└── Pictures

설명

우리가 다루고있는 것은이 명령입니다 : python -c ‘import os; [os.walk ( “.”)의 r, d, f에 대한 os.mkdir (r + “/ Pictures”) “‘

여기서 우리는 -c작은 따옴표 안에 주어진 명령을 지정하기 위해 플래그로 파이썬 인터프리터를 호출 합니다. os.walk()함수를 사용하면 모든 하위 디렉토리를 재귀 적으로 r살펴볼 수 있으며 각 하위 디렉토리 (로 표시 )에 대해 os.mkdir()함수 를 통해 그림 폴더를 만듭니다 . r+"/Pictures"하위 디렉토리 문자열과 “/ Pictures”문자열을 결합하여 하나의 경로를 형성하는 간단한 문자열 조작입니다.

요구 사항에 맞게 “/ 사진”을 “/ 사진”으로 바꾸십시오.


답변

bash를 사용하는 경우 간단히 다음을 실행할 수 있습니다.

shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done

globstar옵션은 **“모든 파일과 0 개 이상의 디렉토리 및 하위 디렉토리”와 일치합니다. 즉, 모든 것을 재귀 적으로 일치시킵니다. /끝에 있기 때문에 **/모든 디렉토리 및 하위 디렉토리 (파일 없음)와 일치합니다. 따라서 $d현재 디렉토리와 해당 하위 디렉토리의 모든 디렉토리를 반복하여 Photos디렉토리가 각 디렉토리에 작성됩니다.

의미 의 -p국기 mkdir:

  -p, --parents
          no error if existing, make parent directories as needed

여기서는 대상 디렉토리가 이미 존재하는 경우 오류 메시지를 억제하기 위해 사용하고 있습니다. 오류를 보려면 제거하십시오.

이렇게하면 Photo라는 파일Photo 이 포함 된 대상 디렉토리에 서브 디렉토리 가 작성되지 않습니다 . 이러한 경우에 수행 할 작업을 지정하지 않았으며 지금까지 게시 된 다른 모든 답변에도이 제한이 있습니다.