공백 및 패턴을 포함한 일괄 이름 바꾸기 파일 이름

공백 및 패턴을 포함한 일괄 이름 바꾸기 파일 이름

일반적인 형식으로 이름이 지정된 여러 파일의 이름을 바꾸고 싶습니다.

text1 text2 [firstname.lastname] text3 ... textn.ext

파일 이름에서 텍스트를 제거 하고 싶습니다 [firstname.lastname]. 작업을 단순화하려면 [firstname.lastname]모든 파일에 대해 이름과 성이 고정되어 있다고 가정합니다.

Ubuntu 12.04를 사용하고 있으며 다음 명령을 시도했습니다.

$ find . -name "*.ext" -print | xargs sed -i 's/[firstname.lastname]//g'

하지만 작동하지 않습니다.

답변1

Bash 와일드카드를 사용하세요.

for i in *.ext; do
    echo mv -nv -- "$i" "${i/firstname.lastname/}"
done

만족스러우면 에코를 삭제하세요.


하위 디렉토리로 이동해야 하는 경우:

shopt -s globstar
for i in **/*.ext; do
    echo mv -nv -- "$i" "${i/firstname.lastname/}"
done

echo만족스러우면 제거하세요.


사용 find:

find . -name '*.ext' -exec bash -c 'echo mv -nv -- "$0" "${0/firstname.lastname/}"' {} \;

echo만족스러우면 제거하세요.


이름을 바꿀 수 있는 방법은 어떻습니까? 모든 형태의 패턴을 제거합니다 (따라서 파일 이름의 또는 를 xxx.yyy제거합니다 ). 이를 위해(첫 번째 방법 사용):firstname.lastnamejohn.doejames.brown

shopt -s extglob
for i in *.ext; do
    echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph]])/}"
done

아니면 두 번째 방법을 사용하세요:

shopt -s globstar extglob
for i in **/*.ext; do
    echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph:]])/}"
done

또는 다음 find방법을 사용하십시오.

find . -name '*.ext' -exec bash -c 'shopt -s extglob; echo mv -nv -- "$0" "${0/+([[:graph:]])\.+([[:graph:]])/}"' {} \;

firstname.lastname패턴이 항상 공백 사이에 포함되어 있는 경우 패턴 대체를 사용할 수도 있습니다.

"${i/*([[:space:]])+([[:graph:]])\.+([[:graph:]])*([[:space:]])/ }"

그래서 한 칸만 남게 됩니다.


노트.이 모든 방법은 공백 및 기타 흥미로운 기호가 포함된 파일 이름에 대해 100% 안전합니다.

답변2

sed파일의 내용을 수정합니다. 사용rename대신에.

$ find . -name "*.ext" -print0 | xargs -0 rename 's/\[firstname\.lastname\]//g'

미리보기를 제공하려면 rename플래그를 전달하세요 . -n이렇게 하면 실제로 파일 이름을 바꾸지 않고도 명령을 테스트할 수 있습니다.

또한 코드에 몇 가지 다른 변경 사항을 적용했습니다.

  • -print0to find-0to를 추가하면 xargs명령이 공백을 처리할 수 있습니다. 기본적으로 에서는 find줄 바꿈을 사용하여 출력의 파일 이름을 구분하고 xargs공백으로 구분된 파일 이름을 수신할 것으로 예상합니다. 두 명령 모두 널 바이트를 파일 이름 구분 기호로 처리하도록 -print0만듭니다 . -0바라보다이 문제더 많은 정보를 알고 싶습니다.

  • rename사용펄 정규식., , [, 및 을 특별히 취급합니다 ]. 이런 경우에는 탈출해야 합니다.

관련 정보