
나는 이것에 대해 조금 이해합니다. 아래 명령은 모든 파일 이름에서 공백을 제거합니다.
find . -type f -name "* *.*" -exec bash -c 'mv "$0" "${0// /}"' {} \;
쉼표, 마침표 및 괄호( , ,
, .
, (
및 ) 도 제거하고 싶지만 )
명령에서 제거하려는 문자를 배치할 위치를 모르겠습니다.
답변1
짧은 대답은 다음과 같습니다. 파일 이름(에서 $0
)에서 공백, 쉼표, 마침표 및 괄호를 제거하는 명령은 다음과 같습니다 .
mv "$0" "${0//[ ,.()]/}"
하지만 그것을 사용하지 마십시오 ...
더 긴 답변:
귀하의
find
명령은 다음과 같습니다-name "* *.*"
. 이름에 공백이 하나 이상 포함된 파일을 선택합니다. 그 뒤에는 적어도 하나의 마침표가 옵니다. 이름에 공백이 포함되지 않은 파일을 처리하지 않는 것이 합리적입니다. 공백이 없으면 제거할 것이 없기 때문입니다. 하지만 해당 명령이 기간 동안 테스트되는 이유를 모르겠습니다. 이름이fat cat.txt
로 변경되지만 그대로 유지fatcat.txt
됩니다 .hot dog
frank.fur ter
이름에 마침표가 있는 파일의 이름을 바꾸려면(마침표를 제거하기 위해) 테스트
-name
를-name "*[ ,.()]*"
.미리 알려지지 않은 파일 이름을 처리할 때는
--
첫 번째 파일 이름 앞에 두는 것이 가장 좋습니다. 일을 할 때 이것이 꼭 필요한 것은 아니라고 주장할 수 있지만find . … -exec …
, 들이는 것은 좋은 습관입니다.fat cat.txt
및 이라는 파일이 있는 경우f a t c a t.txt
둘 다 로 이름이 바뀌고fatcat.txt
두 번째 파일이 첫 번째 파일을 방해합니다.-n
(no-clobber) 옵션을 전달하면mv
이러한 일이 발생하지 않습니다. 하지만 주의하세요. 이름에 공백 등이 포함된 파일이 남게 되며 문제가 있다는 사실조차 알려주지 않을 수도 있습니다!현재 명령은
bash
모든 파일에 대해 새 프로세스를 호출합니다. 이로 인해 필요 이상으로 시간이 오래 걸릴 수 있습니다.bash
한 번 호출한 다음mv
여러 번 호출하는 것이 좋습니다 . 그래서 위의 내용을 모두 종합하면,find . -type f -name "*[ ,.()]*" -exec bash -c 'mv -n -- "$1" "${1//[ ,.()/}"' sh {} +
하지만 기다려! 우리는 아직 끝나지 않았습니다! 위의 내용을 사용하지 마십시오.
find
를 사용하여 명령을 실행할 때-exec
파일의 경로 이름을 명령에 전달합니다.fat cat.txt
현재 디렉터리에 파일이 호출되면 bash 명령으로find
전달됩니다 ../fat cat.txt
위 명령은fat cat.txt
(./fat cat.txt
)의 이름을 로 바꾸려고 시도합니다/fatcattxt
. 루트(예: )로 실행 중인 경우sudo
파일이 루트 디렉터리로 이동되어 큰 혼란이 발생합니다. (교훈:sudo
꼭 필요하다고 확신하지 않는 한 에서 명령을 실행하지 마십시오 .) 루트로 실행하지 않는 경우 '좋은 소식'은 명령이 아무 작업도 수행하지 않는다는 것입니다.이제 모든 것을 종합하면 다음과 같습니다.
find . -type f -name "*[ ,.()]*" -exec bash -c 'for f do dir="$(dirname "$f")"; base="$(basename "$f")"; echo mv -n -- "$f" "$dir/${base//[ ,.()]}"; done' sh {} +
echo
위의 명령에는 "도약하기 전에 살펴보기" 조치가 포함되어 있습니다 . 위의 명령을 실행하면mv
필요한 모든 명령이 표시됩니다 . 문제가 없어 보이면 “echo
”을 제거하고 명령을 다시 실행하십시오.
그건 그렇고, 질문에 표시하는 명령은 다음과 같은 파일이 있으면 실패합니다. .
이름에 공백이 있는 디렉토리에 있습니다.