폴더가 여러 개 있는데 모든 폴더를 반복하고 각 폴더에 “사진”이라는 다른 폴더를 만듭니다.
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
이 포함 된 대상 디렉토리에 서브 디렉토리 가 작성되지 않습니다 . 이러한 경우에 수행 할 작업을 지정하지 않았으며 지금까지 게시 된 다른 모든 답변에도이 제한이 있습니다.