내 폴더 및 하위 폴더 이름에서 "."를 제거하고 싶습니다.
"Archive.1"이라는 폴더가 있습니다. "Archive.2"(등)에는 "Document.1" 등의 폴더가 있습니다. (etc...), "Document.1" 등의 폴더가 있습니다. "."을 모두 제거하고 싶습니다. 내부에는 "Archive1"과 "Document1"이 있습니다.
다음으로 시작하는 스크립트가 있습니다.
for f in *.mp4; do fn=`echo $f|sed 's/\.//g'`; mv "$f" "$fn"; done
하지만 내가 있는 폴더만 탐색합니다.
도와주세요?
미리 감사드립니다.
답변1
find
(기본적으로) 전체 하위 트리를 재귀적으로 검색하는 를 사용할 수 있습니다 .
find -depth -type d -name '*.*' |
while read f
do
dn=`dirname "$f"`
bn=`basename "$f"`
mv "$dn/$bn" "$dn/${bn//.}"
done
이 find
명령은 다음을 포함하는 일치하는 이름을 의미합니다 .
. 이 -depth
옵션을 사용하면 실행됩니다.후순위 순회현재 디렉터리 트리에서, 즉 해당 디렉터리 자체 이전의 모든 디렉터리 내용이 확인되므로 a.b/c.d
다른 일치 디렉터리(예: " ")를 포함하는 일치 디렉터리가 일치 항목으로 출력됩니다.뒤쪽에하위 항목과 일치합니다(따라서 " a.b/c.d
" 뒤에 " a.b
"가 옴). 이것이 없으면 find
경로의 일부가 중간에 변경될 수 있다는 사실을 모르거나 고려하지 않고 전체 목록이 생성되기 때문에 루프가 실패할 수 있습니다 . 루프는 미리 컴파일된 목록에서만 작동하고 " a.b
" -> " ab
"를 실행한 다음 실행을 시도합니다. " a.b/c.d
" -> " a.b/cd
". Postorder Traversal은 이 문제를 해결할 수 있습니다.
Bash에서 공백이 있는 파일 이름을 처리하는 것은 공백을 인수 구분 기호로 취급하는 경향이 있기 때문에 항상 고통스럽습니다. 위의 방법은 read
개행 문자만 구분 기호로 처리하는 내장 함수를 사용하여 이 문제를 해결합니다.
전체 경로 이름이 아닌 각 디렉터리의 이름에 대해서만 작업을 수행하려고 하므로 이를 여러 부분으로 나눕니다.앞으로마지막 슬래시("dirname")와 실제 파일 이름("basename")이며 기본 이름에서만 작동합니다.
또한 패턴 교체를 사용하면 외부 필터를 사용하지 않고도 쉽게 변환을 처리할 수 있습니다. 일반적인 형태 ${parameter/pattern/string}
는 에 비해 친숙해 보여야 한다는 것 입니다 sed
. 그러나 여기서는 다른 슬래시로 시작하는 것은 에서와 pattern
마찬가지로 모든 일치 항목을 교체해야 함을 나타내는 데 사용됩니다 . 또한, 비어 있으므로 앞의 슬래시를 생략할 수 있습니다./g
sed
string
왜 일치시키려고 하는지 잘 모르겠습니다 *.mp4
. .mp4
파일이 있는 경로 만 찾고 계십니까 ? 그렇다면 상황이 조금 복잡해집니다. 먼저 해당 파일에 대한 경로 이름 목록을 생성한 다음 해당 파일에서 디렉터리 경로 이름 목록을 필터링하고 올바른 순서로 작업하는지 확인해야 합니다.