모든 디렉토리 내에 재귀 적으로 "사진"폴더를 만듭니다.


9

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

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

가지고 싶다:

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

답변:


8

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의 제안 포함).

1
나는 ls 파싱을 피할 것 입니다. 이상한 방식으로 실패 할 수 있습니다. 나는 이것을 피하는 대답이 아마도 더 안전하다고 생각합니다.
Arronical

3
@Arronical ls은 구문 분석되지 않습니다. 그것은 단지 사용자에게 피드백입니다 ... 무슨 일이 일어나고 있는지 보여줍니다. "이것은 사진 디렉토리입니다"라는 단어와 같습니다. 디렉토리를 만들지 않는 이유를 사용자에게 알려줍니다.
LD James

1
나는 아무것도 할 수 없었기 때문에 그럴 수도 있다고 생각했다. 이 경우에, 나는 나의 의견을 철회하고 기울어진다 :)
Arronical

find -type d F1, 아마도?
Olivier Grégoire

이라는 파일 (디렉토리 $i/Photo가 아님)이 있으면 OP가 실패 하지만 OP는 이러한 경우 수행 할 작업을 지정하지 않았습니다. $is 중 하나가 개행 문자를 포함하는 경우는 드물지만 실패합니다 .
terdon

24

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

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

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


아 좋은, 나는 그것을 그렇게 시도하고 내가 잘못 가고있는 당신의 대답에서 본 :)
Zanna

@ 잔나 -prune? :) 그렇습니다. 직관적이지 않지만 학습 할 가치가 있습니다.
Melebius

'사진'이라는 파일이 있으면 '사진'폴더 만들기가 중지됩니까?
Anwar

3
@Anwar 현재 버전입니다. 요구 사항에 회색 영역이 있습니다. :) before -type d와 함께 지정하여이를 변경할 수 있습니다 . -name 'Photo'-prune
Melebius

2
@Anwar 언뜻 보면 이해가되지 않습니다. 같은 폴더 내에서 일반 파일과 이름이 같은 폴더를 만들 수 없습니다. 그리고 find다른 폴더 (해당 폴더의 하위 폴더 포함)를 계속 사용합니다.
Melebius

9

이런 식 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에게 감사드립니다. :)


op의 F1디렉토리가 ~user/Pictures인 경우 부모 디렉토리로 이동하고 행을 실행하면 Photo디렉토리의 모든 디렉토리에 디렉토리 가 배치됩니다 . F1쉽게 실수하지 않도록 명령 줄의 일부로를 추가하십시오 . 그렇게하면 실수로 잘못된 위치에서 실행되면 디렉토리가 생성되지 않습니다.
LD James

아 그래, 나는 실제로 그들의 디렉토리 구조를 확신하지 못했다. 나는에서 그 일을 제안 F1하는 대신, 편집 @LDJames
ZANNA

5

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"문자열을 결합하여 하나의 경로를 형성하는 간단한 문자열 조작입니다.

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


4

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 이 포함 된 대상 디렉토리에 서브 디렉토리 가 작성되지 않습니다 . 이러한 경우에 수행 할 작업을 지정하지 않았으며 지금까지 게시 된 다른 모든 답변에도이 제한이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.