디렉토리의 모든 파일 이름에서 "_"를 제거하는 방법

디렉토리의 모든 파일 이름에서 "_"를 제거하는 방법

Bash에는 _.

나는 그것을 포함하는 모든 파일에서 접두사를 사용 rename하거나 mv간단히 제거할 수 있다고 확신합니다._

나는 시도한다:

for file; do
    mv "$file" "${file//_/}"
done

그러나 이것은 내가 원하는 효과를 얻지 못했습니다. _모든 파일에서 접두어를 제거하려면 어떤 명령을 사용할 수 있습니까 ?

답변1

1) for file; do스크립트의 명령줄 매개변수인 루프 위치 매개변수입니다. for file in *; do디렉터리의 파일을 반복하는 데 사용됩니다 (또는 _*밑줄이 앞에 붙은 파일만 가져옵니다).

2) 파일 이름 시작 부분의 밑줄을 제거하는 ${file#_}대신 사용할 수 있습니다 . 특히 처음부터 섹션을 제거했습니다. 이는 표준 기능이며 물론 로 제거됩니다 .${file//_/}${par#word}${par/pat/repl}${file//_}모두첫 번째 슬래시뿐만 아니라 슬래시(이중 슬래시를 사용했기 때문에).

3) 최소한 Linux(GNU Userland) 및 FreeBSD에서는 mv -n이를 사용하여 파일을 덮어쓰지 않도록 요청할 수 있습니다. 혹시라도.

그래서,

for file in _*; do
    mv -n -- "$file" "${file#_}"
done

답변2

간단하게prename(Perl 이름 바꾸기) 명령:

prename -n 's/^_//' _*

답변3

당신은 매우 가깝습니다:

for file in _*; do
    if ! [[ -f "${file/_/}" ]]; then
        mv "$file" "${file/_/}"
    else
        echo "Replacement for '$file' already exists; skipping.." 1>&2
    fi
done

${file/_/}? 밑줄 접두사를 지정했기 때문입니다. 그래서 _file_name.ext그것은 될 것입니다 file_name.ext. 당신이 그것을 가지고 있다면 ${file//_/}, _file_name.ext당신은 그것이 될 것입니다 filename.ext.

답변4

당신은 sed를 사용할 수 있습니다

for file in /some/path/*; do
    if [ -f "$file" ]; then
        mv "$file" `echo "$file" | sed 's*_**g'`
    fi
done

관련 정보