파일 이름에서 모든 하이픈을 재귀적으로 제거하는 방법

파일 이름에서 모든 하이픈을 재귀적으로 제거하는 방법

폴더가 많고 그 안에 파일이 1개 있습니다. 삭제하려면 먼저 이름을 일괄 변경해야 합니다.

-(견본)

그래서

파일명-(샘플).mp3

~이 되다

파일명.mp3

상위 폴더에는(견본)마지막으로 삭제할 수도 있습니다(견본)폴더에서 다음 명령을 실행합니다.

find . -name '*\(sample)*' | while read f; do mv "$f" "${f//\(sample)/}"; done

두 번째로 다시 실행하면 포함된 파일 이름에서 (샘플)이 제거됩니다(첫 번째 실행에서는 제거되지 않음).

그러니 나에게 남은 건

파일명-.mp3

내가 입력한 코드에 아래와 같이 하이픈을 추가합니다.

'*\-(sample)*'

작동하지 않습니다.

하루 종일 온라인에서 다른 많은 것들을 시도했지만 아무 것도 작동하지 않습니다. 서버가 "이름 바꾸기"와 같은 특정 명령을 인식하지 못합니다.

저는 로컬에서 파일 이름을 변경하기 위해 수천 개의 샘플 파일을 다운로드하지 않으려고 노력하고 있습니다. 이것이 바로 제가 할 수 있는 일입니다.

서버가 데비안을 실행 중입니다.

하지만 모르겠어 어쩌면 떠날지도 몰라-.mp3괜찮을까요? 좀 엉성하고 이상해 보이죠? 파일 이름 시작 부분에 하이픈을 남겨두면 문제가 발생할 수 있다는 내용을 읽었는데 반대쪽도 마찬가지일까요?

나는 지침을 꽤 잘 따를 수 있지만(그리고 더 잘 이해하기 위해 항상 답을 먼저 연구할 것입니다), 나는 전문가가 아니므로 이 점을 명심하십시오.

누구든지 다른 제안이 있다면 좋을 것입니다. 하이픈을 제외하고 폴더/파일 이름에서 원하는 것은 무엇이든 제거할 수 있습니다.

감사해요!

답변1

먼저, 가장 낮은(가장 깊은) 일치부터 시작합니다 find. 그렇지 않으면 상위 디렉터리의 이름을 바꿀 수 있으며, 거기에서 더 이상 하위 디렉터리와 파일을 찾을 수 없기 때문에 다음 이름 바꾸기가 실패할 수 있습니다. 두 번째는 rename(IMHO) 더 간단한 도구입니다. 세 번째는 직접 실행을 통해서이다 find.

find -depth -name '*-(sample)*' -exec rename --nopath 's:-\(sample\)::' '{}' +

-n먼저 테스트하려는 경우 이 옵션을 옵션 으로 사용하세요 rename. 연습 실행을 수행하고 변경 사항을 표시합니다. 이 --nopath옵션은 이전 디렉터리의 이름을 먼저 바꾸지 않도록 하기 위해 필요합니다.

관련 정보