Bash를 사용하여 디렉터리 이름과 하위 디렉터리의 모든 점을 공백으로 바꾸려고 합니다.
예: 디렉토리목차 1.3 될 것입니다목차 1 3
지금까지 내 스크립트는 다음과 같습니다.
#!/bin/bash
for dir in *\ -\ *; do
[[ -d "$dir" ]] || continue # skip if not a directory
sub="${dir#* - }"
if [[ ! -e "$sub" ]]; then
mv "$dir" "$sub"
mv echo "$(echo "Result: ${dir%.*}" | sed 's/\./ /g').${dir##*.}"
fi
done
답변1
사용 find
:
find . -mindepth 1 -type d -name "*.*" -exec bash -c '
for ((i=$#;i>0;i--)); do
dir=${!i}
newdir=$(dirname "$dir")/$(basename "$dir" | tr -s "." " ")
if [ -e "$newdir" ]; then
echo "skipping \"$dir\", \"$newdir\" already exists" >&2
else
mv "$dir" "$newdir"
fi
done
' bash {} +
*.*
패턴을 사용하여 현재 디렉토리의 모든 디렉토리 이름을 재귀적으로 찾고 -mindepth 1
. 발견된 디렉터리 목록은 -exec
bash 스크립트로 전달되며, 여기서 해당 인수는 for 루프에서 역순으로 처리됩니다(더 깊은 수준의 하위 디렉터리가 먼저 표시됨).
새 디렉토리 이름은 dirname
해당 합계를 기준으로 생성 됩니다 basename
. 후자는 tr
여러 점이 단일 공백 문자로 바뀌는 곳에서 수정됩니다( -s
여러 점을 여러 공백으로 바꾸려면 옵션을 제거하세요). 새 디렉토리 이름이 이미 존재하는 경우 오류 메시지를 인쇄하거나 이동하십시오.