답변:
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
.ls
은 구문 분석되지 않습니다. 그것은 단지 사용자에게 피드백입니다 ... 무슨 일이 일어나고 있는지 보여줍니다. "이것은 사진 디렉토리입니다"라는 단어와 같습니다. 디렉토리를 만들지 않는 이유를 사용자에게 알려줍니다.
find -type d F1
, 아마도?
$i/Photo
가 아님)이 있으면 OP가 실패 하지만 OP는 이러한 경우 수행 할 작업을 지정하지 않았습니다. $i
s 중 하나가 개행 문자를 포함하는 경우는 드물지만 실패합니다 .
단일 find
통화를 사용하여 달성 할 수 있습니다 .
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
이 부분 -name 'Photo' -prune -o
은 기존 (및 새로 작성된) Photo
디렉토리로 재귀하지 않도록 지시 합니다. 발견 된 파일 (또는 디렉토리)의 이름이 Photo
있으면 처리를 중지하십시오 ( -prune
). 다른 경우 ( -o
), 디렉토리 ( -type d
)를 계속 진행 -exec
하고 명령을 실행 ( )하십시오.
-prune
? :) 그렇습니다. 직관적이지 않지만 학습 할 가치가 있습니다.
-type d
와 함께 지정하여이를 변경할 수 있습니다 . -name 'Photo'
-prune
find
다른 폴더 (해당 폴더의 하위 폴더 포함)를 계속 사용합니다.
이런 식 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에게 감사드립니다. :)
F1
디렉토리가 ~user/Pictures
인 경우 부모 디렉토리로 이동하고 행을 실행하면 Photo
디렉토리의 모든 디렉토리에 디렉토리 가 배치됩니다 . F1
쉽게 실수하지 않도록 명령 줄의 일부로를 추가하십시오 . 그렇게하면 실수로 잘못된 위치에서 실행되면 디렉토리가 생성되지 않습니다.
F1
하는 대신, 편집 @LDJames
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
이 포함 된 대상 디렉토리에 서브 디렉토리 가 작성되지 않습니다 . 이러한 경우에 수행 할 작업을 지정하지 않았으며 지금까지 게시 된 다른 모든 답변에도이 제한이 있습니다.